Jaki jest najprostszy sposób uzyskania pełnej rekurencyjnej listy plików w folderze z pythonem? Wiem o os.walk()
, ale wydaje się, że jest to przesadne, jeśli chodzi o uzyskanie niefiltrowanej listy wszystkich plików. Czy to naprawdę jedyna opcja?Najprostszy sposób na uzyskanie odpowiednika "znajdź". w python?
Odpowiedz
Nic nie uniemożliwia tworzenia własnych funkcji:
import os
def listfiles(folder):
for root, folders, files in os.walk(folder):
for filename in folders + files:
yield os.path.join(root, filename)
Można go używać tak:
for filename in listfiles('/etc/'):
print filename
Albo to, albo ręcznie recursing z isdir()
/isfile()
i listdir()
lub można użyć subprocess.check_output()
i nazywają find .
. W zasadzie os.walk()
jest najwyższym poziomem, nieco niższy poziom to rozwiązanie pół-ręczne oparte na listdir()
, a jeśli chcesz, to samo wyjście find .
dałoby Ci z jakiegoś powodu wywołanie systemowe z subprocess
.
+1 dla 'os.walk()'. – Blender
import os
path = "path/to/your/dir"
for (path, dirs, files) in os.walk(path):
print files
Czy to przesada, albo ja czegoś brakuje?
Masz absolutną rację. Wygląda o wiele trudniej niż w rzeczywistości. –
os.walk()
nie jest przesadą w żaden sposób. To może wygenerować listę plików i katalogów migiem:
files = [os.path.join(dirpath, filename)
for (dirpath, dirs, files) in os.walk('.')
for filename in (dirs + files)]
można przekształcić generator, aby przetwarzać tylko jedną ścieżkę w czasie i bezpieczne pamięci.
+1 dla najbardziej pytonowego rozwiązania :) – kgr
Można również użyć programu sam find
od Python przy użyciu sh
import sh
text_files = sh.find(".", "-iname", "*.txt")
Dzięki! Chciałem tylko upewnić się, że ta funkcja nie jest już częścią standardowej biblioteki. –
Chciałbym, żeby ktoś istniał. Zawsze możesz edytować 'os.py';) – Blender
Ładne rozwiązanie! Ale 'find .' również wyświetla katalogi. Poprawka jest jednak bardzo łatwa. :) –