Aby pominąć katalogi, możesz zrobić „* .fileextension” dla dowolnego rozszerzenia pliku, którego szukasz.
Odpowiedzi:
275
os.listdir()będzie nieco bardziej wydajny niż używanie glob.glob. Aby sprawdzić, czy nazwa pliku jest zwykłym plikiem (a nie katalogiem lub inną jednostką), użyj os.path.isfile():
import os, os.path
# simple version for working with CWDprint len([name for name in os.listdir('.')if os.path.isfile(name)])# path joining version for other paths
DIR ='/tmp'print len([name for name in os.listdir(DIR)if os.path.isfile(os.path.join(DIR, name))])
W przypadku rekurencyjnego zliczania plików zagnieżdżonych w katalogach lepiej byłoby skorzystać z rozwiązania os.walk ().
Joel B,
Jakie są korzyści z korzystania os.path.join(DIR, name)przez DIR + '/' + name? Ten drugi jest krótszy i, według IMO, wyraźniejszy niż ten pierwszy. Czy jest może jakiś system operacyjny, na którym ten ostatni zawiedzie?
HelloGoodbye,
@HelloGoodbye To jest dokładnie powód.
ellockie
102
import os
path, dirs, files = next(os.walk("/usr/lib"))
file_count = len(files)
Jest to o wiele szybsze (mniej więcej połowa czasu, gdy testuję katalog z 10 000 plików), jeśli znasz wzorzec, którego szukasz, zamiast testować każdy plik os.path.isfile()zgodnie z przyjętą odpowiedzią. Również znacznie szybszy niż glob.glob().
CivFan 27.04.16
14
Jeśli chcesz policzyć wszystkie pliki w katalogu - w tym pliki w podkatalogach, najbardziej pythonowym sposobem jest:
import os
file_count = sum(len(files)for _, _, files in os.walk(r'C:\Dropbox'))print(file_count)
Używamy sumy, która jest szybsza niż jawne dodawanie liczników plików (czas oczekiwania
Cześć, próbowałem zrozumieć ten kod (kod działa idealnie), wiem, że możemy użyć _w forpętli. os.walkja też wiem. Ale nie jestem pewien, co się dzieje z podkreśleniami wewnątrz sumfunkcji, czy mógłbyś to rozwinąć. Dzięki!
Ejaz
1
Unsderscore to po prostu nazwa zmiennej @Ejaz, zgodnie z konwencją używaną, gdy ignorujemy zmienną - to właśnie tutaj robimy - nazywamy walk i liczymy tylko liczbę plików w każdym katalogu, ignorując wartości zwracane przez root i dirs walk
def count_em(valid_path):
x =0for root, dirs, files in os.walk(valid_path):for f in files:
x = x+1print"There are", x,"files in this directory."return x
Analizowanie wyniku lsjest na ogół niezadowolone (może często powodować problemy), chociaż nie jest to zła metoda „szybkiego i brudnego” w powłoce. Powinieneś jednak użyć ls -1, więc gwarantuje to jeden wiersz na plik.
Bloodgain
3
Chociaż zgadzam się z odpowiedzią udzieloną przez @DanielStutzbach: os.listdir()będzie nieco bardziej wydajna niż używanie glob.glob.
Jednak dodatkową precyzję, jeśli chcesz policzyć liczbę określonych plików w folderze, chcesz użyć len(glob.glob()). Na przykład, jeśli chcesz policzyć wszystkie pliki pdf w folderze, którego chcesz użyć:
po prostu zlicza liczbę plików w katalogu, użyłem techniki rozumienia listy do iteracji przez określony katalog zwracając wszystkie pliki w zamian. „len (lista zwrócona)” zwraca liczbę plików.
Znalazłem inną odpowiedź, która może być poprawna jako odpowiedź zaakceptowana.
for root, dirs, files in os.walk(input_path):for name in files:if os.path.splitext(name)[1]=='.TXT'or os.path.splitext(name)[1]=='.txt':
datafiles.append(os.path.join(root,name))print len(files)
zrobiłem to i to zwróciło liczbę plików w folderze (Attack_Data) ... to działa dobrze.
import os
def fcount(path):#Counts the number of files in a directory
count =0for f in os.listdir(path):if os.path.isfile(os.path.join(path, f)):
count +=1return count
path = r"C:\Users\EE EKORO\Desktop\Attack_Data"#Read files in folderprint(fcount(path))
Odpowiedzi:
os.listdir()
będzie nieco bardziej wydajny niż używanieglob.glob
. Aby sprawdzić, czy nazwa pliku jest zwykłym plikiem (a nie katalogiem lub inną jednostką), użyjos.path.isfile()
:źródło
folder_path
wnętrze,os.path.filename(name)
jeśli nie jesteś na cwd. stackoverflow.com/questions/17893542/…os.path.join(DIR, name)
przezDIR + '/' + name
? Ten drugi jest krótszy i, według IMO, wyraźniejszy niż ten pierwszy. Czy jest może jakiś system operacyjny, na którym ten ostatni zawiedzie?źródło
Dla wszystkich rodzajów plików zawarte są podkatalogi:
Tylko pliki (unikając podkatalogów):
źródło
Tutaj bardzo przydatny jest program fnmatch:
Więcej informacji: http://docs.python.org/2/library/fnmatch.html
źródło
os.path.isfile()
zgodnie z przyjętą odpowiedzią. Również znacznie szybszy niżglob.glob()
.Jeśli chcesz policzyć wszystkie pliki w katalogu - w tym pliki w podkatalogach, najbardziej pythonowym sposobem jest:
Używamy sumy, która jest szybsza niż jawne dodawanie liczników plików (czas oczekiwania
źródło
_
wfor
pętli.os.walk
ja też wiem. Ale nie jestem pewien, co się dzieje z podkreśleniami wewnątrzsum
funkcji, czy mógłbyś to rozwinąć. Dzięki!źródło
źródło
Dziwi mnie, że nikt nie wspominał
os.scandir
:źródło
To używa
os.listdir
i działa dla dowolnego katalogu:można to uprościć za pomocą generatora i nieco przyspieszyć za pomocą:
źródło
Zaczerpnięte z tego postu
źródło
files
jest listą. 2. OP nie szuka rekurencyjnego liczeniaźródło
Formatowanie kodu Luke'a.
źródło
Oto proste polecenie w jednym wierszu, które uznałem za przydatne:
źródło
ls
jest na ogół niezadowolone (może często powodować problemy), chociaż nie jest to zła metoda „szybkiego i brudnego” w powłoce. Powinieneś jednak użyćls -1
, więc gwarantuje to jeden wiersz na plik.Chociaż zgadzam się z odpowiedzią udzieloną przez @DanielStutzbach:
os.listdir()
będzie nieco bardziej wydajna niż używanieglob.glob
.Jednak dodatkową precyzję, jeśli chcesz policzyć liczbę określonych plików w folderze, chcesz użyć
len(glob.glob())
. Na przykład, jeśli chcesz policzyć wszystkie pliki pdf w folderze, którego chcesz użyć:źródło
To jest proste:
po prostu zlicza liczbę plików w katalogu, użyłem techniki rozumienia listy do iteracji przez określony katalog zwracając wszystkie pliki w zamian. „len (lista zwrócona)” zwraca liczbę plików.
źródło
źródło
Jeśli będziesz używać standardowej powłoki systemu operacyjnego, możesz uzyskać wynik znacznie szybciej niż w czysto pythoniczny sposób.
Przykład dla systemu Windows:
źródło
Znalazłem inną odpowiedź, która może być poprawna jako odpowiedź zaakceptowana.
źródło
Użyłem
glob.iglob
struktury katalogów podobnej doObie następujące opcje zwracają 4 (zgodnie z oczekiwaniami, tzn. Nie liczą samych podfolderów )
len(list(glob.iglob("data/train/*/*.png", recursive=True)))
sum(1 for i in glob.iglob("data/train/*/*.png"))
źródło
zrobiłem to i to zwróciło liczbę plików w folderze (Attack_Data) ... to działa dobrze.
źródło