Подтвердить что ты не робот

Использование подстановочных файлов расширения в os.listdir(путь)

У меня есть каталог файлов, которые я пытаюсь проанализировать с помощью 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. Спасибо!

4b9b3361

Ответ 1

Возможно, модуль glob может помочь вам:

import glob

listing = glob.glob('C:/foo/bar/foo.log*')
for filename in listing:
    # do stuff

Ответ 2

Какой лучший маршрут для чтения и анализа только файлов 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 вместо этого), и это будет более гибким. Итак, если вы не беспокоитесь о том, что меня смущают два слегка разных значения подстановочных знаков, я бы предложил принять это вместо этого.

Ответ 3

Это даст вам bash -образные регулярные выражения:

import glob
print(glob.glob("/tmp/o*"))

Кроме того, вы можете os.listdir весь каталог и выбросить файлы, которые не соответствуют регулярному выражению через модуль re.