Я пытаюсь получить список всех файлов журнала (.log) в каталоге, включая все подкаталоги.Как получить файлы в каталоге, включая все подкаталоги
ответ
Оформить заказ Python Recursive Directory Walker. Короче говоря, os.listdir() и os.walk() - ваши друзья.
Если Вы хотите перечислить в текущем каталоге, Вы можете использовать что-то вроде:
import os
for e in os.walk(os.getcwd()):
print e
Просто измените
os.getcwd()
на другой путь, чтобы получить результаты там.
Этот ответ не затрагивает вопрос OP и не имеет отношения к большинству людей, которые будут искать тот же ответ. – Andrew
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)
Если вы хотите искать в другом каталоге от "." вы можете передать директиву как sys.argv [1] и вызвать os.walk (sys.argv [1]). – 2009-06-05 07:12:38
Дополнительное усовершенствование: используйте генератор вместо понимания списка: для filename in (f for f ...) – 2009-06-05 07:17:45
Если вы хотите исключить определенный каталог, например, 'old_logs', вы можете просто удалить его из' dirnames', и это не будет искать: 'if" old_logs "в dirnames: dirnames.remove (" old_logs ")' – CGFoX
Вы также можете использовать модуль 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)))
Что делают подчеркивания в for-loop? '_' –
@nueverest 'os.walk' возвращает 3-кортеж' (dirpath, dirnames, filenames) 'на каждой итерации, и нас интересует только' dirpath' (назначается 'dir' выше); подчеркивания просто используются в качестве заполнителей для других 2 значений, которые нам не интересны (т. е. 'dirnames', а затем' filenames', назначаются переменной '_', которую мы никогда не будем использовать). – tavnab
У меня есть решение:
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
Это уже было предложено: http://stackoverflow.com/questions/837606/find-the-oldest-file-recursively-in- a-directory, а также несколько других (поиск «Python walk» в окне поиска) –