Чтение одного и того же имени файла из нескольких мест - PullRequest
2 голосов
/ 24 января 2012

У меня есть файл XML с именем junit.xml в том же каталоге, что и мой скрипт, я могу разобрать его, выполнив:

xml_file = os.path.abspath(__file__)
xml_file = os.path.dirname(xml_file)
xml_file = os.path.join(xml_file, "junit.xml")
root = ET.parse(xml_file).getroot();  # Where ET is the element tree

и все в порядке.

Однако яЕсть более сложный пример, где мне нужно проанализировать кучу файлов с одинаковым именем "junit.xml", которые находятся в разных каталогах подряд.

Каталоги следующие:

\myhome\ireland\modules\builds\date1
\myhome\ireland\modules\builds\date2
\myhome\england\modules\builds\date1
\myhome\england\modules\builds\date2
\myhome\scotland\modules\builds\date1
\myhome\scotland\modules\builds\date2
\myhome\wales\modules\builds\date1
\myhome\wales\modules\builds\date2
\myhome\germany\modules\builds\date1
\myhome\germany\modules\builds\date2

Теперь у каждого каталога есть коллекция файлов XML.Я просто хочу получить все файлы с именем junit.xml в:

\myhome\ireland\modules\builds\date2
\myhome\england\modules\builds\date2
\myhome\scotland\modules\builds\date2

Как я могу сделать это с помощью питона, где я могу изменить названия стран и дату, когда мне это нужно?

Ответы [ 5 ]

4 голосов
/ 24 января 2012

Используйте шаблон строки для пути, например:

path = r"\myhome\{}\modules\builds\date{}"

Который вы позже сможете использовать для построения реального пути, используя функцию str.format() (например, path.format("ireland", 1)).

Затем вы можете перебирать названия и даты стран, и для каждого анализировать XML-файл:

for country in ["ireland", "england", "scotland"]:
    for num in [1, 2]:
        parse_xml(path.format(country, num))

Где parse_xml - это определяемая вами функция, которая получает путь к файлу XML и анализирует его.

2 голосов
/ 24 января 2012
countries = ['england','wales','germany','etc']
countrypath = '\myhome\{}\modules\builds'
filename = 'junit.xml'
for country in countries:
    path = countrypath.format(country)
    for item in os.listdir(countrypath):
        if os.path.isdir(item) and item.startswith('date'):
            os.path.join(path, item, filename)
2 голосов
/ 24 января 2012

Сначала определите «шаблон», которому будут следовать ваши файлы, затем список стран и список дат:

dir_template = r'\myhome\%(country)s\modules\builds\%(date)s\junit.xml'
countries = ['ireland', 'england', 'scotland', 'wales', 'germany']
dates = ['date1', 'date2']

for c in countries:
    for d in dates:
        xml_file = dir_template % {'country': c, 'date': d}
        root = ET.parse(xml_file).getroot()
        # ...
0 голосов
/ 24 января 2012
    date = "dateX"
    countries = [ "ireland", "wales", "england"]

    for country in countries:
       path = "\myhome\%(country)s\modules\builds\%(date)s\junit.xml" \
% {"country" : country, "date": date}
       # check to see if the file you want is there?
       if os.path.exists(path):
           root = ET.parse(path).getroot();

Также в модуле "os" есть функция "walk", которая позволяет вам проходить целое поддерево каталога. Возможно, вы захотите взглянуть на то, хотите ли вы «обнаружить» все файлы с именем junit.xml и обработать их.

0 голосов
/ 24 января 2012

Не так эффективно, как предварительно иметь список каталогов кандидатов, но вы также можете рекурсивно искать junit.xml файлы, используя os.walk следующим образом:

import os

def get_junit_filenames(directory):
    for dirpath, dirnames, filenames in os.walk(directory):
        if 'junit.xml' in filenames:
            yield os.path.join(dirpath, 'junit.xml')

for filename in get_junit_filenames('/myhome'):
    <process file>

Таким образом, вам не нужнобеспокоиться о добавлении / удалении каталогов в вашей файловой системе, поскольку файлы junit.xml будут сохраняться независимо от каких-либо изменений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...