2009-06-05 4 views
30

Я пытаюсь получить список всех файлов журнала (.log) в каталоге, включая все подкаталоги.Как получить файлы в каталоге, включая все подкаталоги

+1

Это уже было предложено: http://stackoverflow.com/questions/837606/find-the-oldest-file-recursively-in- a-directory, а также несколько других (поиск «Python walk» в окне поиска) –

ответ

-1

Если Вы хотите перечислить в текущем каталоге, Вы можете использовать что-то вроде:

import os 

for e in os.walk(os.getcwd()): 
    print e 

Просто измените

os.getcwd() 

на другой путь, чтобы получить результаты там.

+0

Этот ответ не затрагивает вопрос OP и не имеет отношения к большинству людей, которые будут искать тот же ответ. – Andrew

59
import os 
import os.path 

for dirpath, dirnames, filenames in os.walk("."): 
    for filename in [f for f in filenames if f.endswith(".log")]: 
     print os.path.join(dirpath, filename) 
+1

Если вы хотите искать в другом каталоге от "." вы можете передать директиву как sys.argv [1] и вызвать os.walk (sys.argv [1]). – 2009-06-05 07:12:38

+2

Дополнительное усовершенствование: используйте генератор вместо понимания списка: для filename in (f for f ...) – 2009-06-05 07:17:45

+1

Если вы хотите исключить определенный каталог, например, 'old_logs', вы можете просто удалить его из' dirnames', и это не будет искать: 'if" old_logs "в dirnames: dirnames.remove (" old_logs ")' – CGFoX

6

Вы также можете использовать модуль glob вместе с os.walk.

import os 
from glob import glob 

files = [] 
start_dir = os.getcwd() 
pattern = "*.log" 

for dir,_,_ in os.walk(start_dir): 
    files.extend(glob(os.path.join(dir,pattern))) 
+0

Что делают подчеркивания в for-loop? '_' –

+1

@nueverest 'os.walk' возвращает 3-кортеж' (dirpath, dirnames, filenames) 'на каждой итерации, и нас интересует только' dirpath' (назначается 'dir' выше); подчеркивания просто используются в качестве заполнителей для других 2 значений, которые нам не интересны (т. е. 'dirnames', а затем' filenames', назначаются переменной '_', которую мы никогда не будем использовать). – tavnab

0

У меня есть решение:

import os 
for logfile in os.popen('find . -type f -name *.log').read().split('\n')[0:-1]: 
     print logfile 

или

import subprocess 
(out, err) = subprocess.Popen(["find", ".", "-type", "f", "-name", "*.log"], stdout=subprocess.PIPE).communicate() 
for logfile in out.split('\n')[0:-1]: 
    print logfile 

Эти два взять преимущество find . -type f -name *.log.

Первый более простой, но не гарантируется для белого пространства, когда добавить -name *.log, но работал отлично для просто find ../testdata -type f (в моем X среде OS).

Второй, использующий подпроцесс, кажется более сложным, но это безопасное пространство белого цвета (опять же, в моей среде OS X).

Это вдохновляется Банч, в ответ https://stackoverflow.com/a/3503909/2834102