Ответ 1
Возможно, модуль glob может помочь вам:
import glob
listing = glob.glob('C:/foo/bar/foo.log*')
for filename in listing:
# do stuff
У меня есть каталог файлов, которые я пытаюсь проанализировать с помощью Python. У меня не было бы проблем, если бы они были одним и тем же расширением, но по какой-то причине они создавались с помощью последовательных числовых расширений после их первоначального расширения. Например: foo.log foo.log.1 foo.log.2 bar.log bar.log.1 bar.log.2 etc.
Кроме того, foo.log находится в формате XML, а bar.log - нет. Каков наилучший путь для чтения и анализа только файлов foo.log.*
и foo.log
? Файлы bar.log
не нужно читать. Ниже мой код:
import os
from lxml import etree
path = 'C:/foo/bar//'
listing = os.listdir(path)
for files in listing:
if files.endswith('.log'):
print files
data = open(os.path.join(path, files), 'rb').read()
tree = etree.fromstring(data)
search = tree.findall('.//QueueEntry')
Это не работает, так как он не читает никаких файлов .log.*
и дросселей парсера в файлах, которые читаются, но не в формате xml. Спасибо!
Возможно, модуль glob может помочь вам:
import glob
listing = glob.glob('C:/foo/bar/foo.log*')
for filename in listing:
# do stuff
Какой лучший маршрут для чтения и анализа только файлов
foo.log.*
иfoo.log
? Файлы bar.log не нужно читать.
Ваш код делает это:
if files.endswith('.log'):
Вы только что перевели свое английское описание в Python немного неправильно. То, что вы пишете на Python: "читать и анализировать только файлы *.log
", что означает bar.log
, а foo.log.1
- нет.
Но если вы думаете на секунду, вы можете перевести свое английское описание прямо в Python:
if files == 'foo.log' or files.startswith('foo.log.'):
И если вы думаете об этом, если нет файлов с именем foo.log.
(с этой дополнительной точкой), которые вы хотите пропустить, вы можете свернуть два случая в один:
if files.startswith('foo.log'):
Однако, если вы знаете что-нибудь о оболочках POSIX, foo.log*
соответствует точно такой же. (Это неверно для оболочек Windows, где специальные шаблоны специально обрабатывают расширения, поэтому вам нужно ввести *.*
вместо *
.) И Python поставляется с модулем, который создает подстановочные знаки в стиле POSIX, даже в Windows, называемый glob
. См. Ответ stranac для использования.
Я думаю, что ответ glob
лучше, чем ручная фильтрация listdir
. Это проще, это более прямое совпадение с тем, что ваш заголовок вопроса говорит, что вы хотите сделать (просто сделайте то, что вы надеялись, будет работать с os.listdir
, но с glob.glob
вместо этого), и это будет более гибким. Итак, если вы не беспокоитесь о том, что меня смущают два слегка разных значения подстановочных знаков, я бы предложил принять это вместо этого.
Это даст вам bash -образные регулярные выражения:
import glob
print(glob.glob("/tmp/o*"))
Кроме того, вы можете os.listdir весь каталог и выбросить файлы, которые не соответствуют регулярному выражению через модуль re.