2013-01-05 20 views
16

Czy istnieje sposób na wylistowanie plików (nie katalogów) w katalogu z Pythonem? Wiem, że mógłbym użyć os.listdir i pętli os.path.isfile() s, ale jeśli jest coś prostszego (jak funkcja os.path.listfilesindir lub coś podobnego), prawdopodobnie byłoby lepiej.Lista tylko plików w katalogu?

+0

[powiązane] (http://stackoverflow.com/q/6664205) – Tshepang

Odpowiedz

29

To a simple generator expression:

files = (file for file in os.listdir(path) 
     if os.path.isfile(os.path.join(path, file))) 
for file in files: # You could shorten this to one line, but it runs on a bit. 
    ... 

Albo można zrobić funkcję generatora, jeżeli nadaje się wam lepiej:

def files(path): 
    for file in os.listdir(path): 
     if os.path.isfile(os.path.join(path, file)): 
      yield file 

Następnie wystarczy:

for file in files(path): 
    ... 
+0

Dlaczego dostałem skargę w tej sprawie? –

+0

zapomniałeś dodać łączenie między dirname i nazwą pliku – ayvango

+0

@ayvango To tylko inne zachowanie - nie było potrzeby, aby podać pełną ścieżkę w pytaniu, a to działa tak, jak jest w dobrze zdefiniowany sposób. –

1

można spróbować pathlib, który ma również wiele innych użytecznych rzeczy.

Pathlib to obiektowa biblioteka do interakcji ze ścieżkami systemu plików. Aby pobrać pliki w bieżącym katalogu, można zrobić:

from pathlib import * 
files = (x for x in Path(".") if x.is_file()) 
for file in files: 
    print(str(file), "is a file!") 

To jest, moim zdaniem, bardziej pythonowy niż przy użyciu os.path.

Zobacz również: PEP 428.

+2

Jedną z powszechnych rad jest unikanie tego rodzaju importu. To znaczy, po prostu importuj to, czego używasz, co w twoim przypadku byłoby po prostu 'from pathlib import Path'. – Tshepang

+1

Chociaż 'pathlib' jest świetny, argumentowałbym, że zależy to od skryptu pod ręką - jeśli tylko kilka razy zajmuje się plikami, w zależności od' pathlib' może to być przesada. –

2

Korzystanie pathlib w Windows następująco:

files = (x for x in Path("your_path") if x.is_file())

Generuje błąd:

TypeError: 'WindowsPath' object is not iterable

Należy raczej używać Path.iterdir()

filePath = Path("your_path") 
if filePath.is_dir(): 
    files = list(x for x in filePath.iterdir() if x.is_file()) 
0

Korzystanie pathlib, najkrótsza droga t o Lista plików to:

[x for x in Path("your_path").iterdir() if x.is_file()] 

z obsługą głębokości w razie potrzeby.

Powiązane problemy