2012-09-14 9 views

Odpowiedz

11

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 
+0

Dzięki! Chciałem tylko upewnić się, że ta funkcja nie jest już częścią standardowej biblioteki. –

+1

Chciałbym, żeby ktoś istniał. Zawsze możesz edytować 'os.py';) – Blender

+0

Ładne rozwiązanie! Ale 'find .' również wyświetla katalogi. Poprawka jest jednak bardzo łatwa. :) –

1

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.

+0

+1 dla 'os.walk()'. – Blender

0
import os 
path = "path/to/your/dir" 
for (path, dirs, files) in os.walk(path): 
    print files 

Czy to przesada, albo ja czegoś brakuje?

+0

Masz absolutną rację. Wygląda o wiele trudniej niż w rzeczywistości. –

4

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.

+0

+1 dla najbardziej pytonowego rozwiązania :) – kgr

1

Można również użyć programu sam find od Python przy użyciu sh

import sh 
text_files = sh.find(".", "-iname", "*.txt") 
Powiązane problemy