Как добавить путь к файлу в скрипте Python - PullRequest
0 голосов
/ 12 марта 2019

У меня есть скрипт, который рекурсивно копается в заданный каталог, выкапывает все файлы с определенным именем и помещает содержимое всех найденных файлов в один файл.

Сценарий работает так, как мне нужно, в плане поиска файлов и вывода всего содержимого в один XML-файл. Однако я хотел бы добавить и путь к файлу, чтобы я знал местоположение каждого данного файла, который он нашел. Это мой код до сих пор:

import glob

lines=[] #list
for inputfile in glob.glob('D:\path\to\scan\**\project_information.xml', recursive=True): 
    with open ('D:\path\result\output.xml', 'w') as out_file:
        with open (inputfile, "rt") as in_file:  
            print("<projectpath>", inputfile, file=out_file)
            for line in in_file: 
                lines.append(line.rstrip('\n'))
            for linenum, line in enumerate(lines):
                print(line, file=out_file)

Каждый project_information.xml, который ищет скрипт, выглядит следующим образом:

<project>
<name>project1</name>
<Projection>UTM84-30N</Projection>
<Build>Jan 30 2015</Build>
</project>

В идеале для каждой записи, которая найдена и впоследствии добавлена ​​к моему выводу, я хотел бы, чтобы она записывала путь к файлу внутри тега. (Вы можете догадаться, что это таблица XML для входа в Excel), например -

<project>
**<filepath>C:\path\to\file\**
<name>project1</name>
<Projection>UTM84-30N</Projection>
<Build>Jan 30 2015</Build>
</project>
<project>
**<filepath>C:\path\to\file\blah\**
<name>project2</name>
<Projection>UTM84-30N</Projection>
<Build>Jan 30 2015</Build>
</project>

Я думал, что добавление строки после оператора with сделает это, но это только для печати первого вхождения и не попадания в цикл. Мало того, что даже если бы это сработало, оно не было бы внутри родительского тега.

print("<projectpath>", inputfile, file=out_file)

Довольно плохо знаком с Python, поэтому любые предложения или изменения в моем сыром коде очень приветствуются!

############ОБНОВИТЬ

Так как @ olinox14 предложил, чтобы я посмотрел на модуль lxml и попросил его добавить в него новый тег.

tree = ET.parse(in_file)
root = tree.getroot()
    for child in root:
        folder = ET.SubElement(child, 'folder')
        folder.text = (in_file.name)
        tree.write('C:\\output\\output2.xml')

1 Ответ

0 голосов
/ 12 марта 2019

Здесь много всего:

  1. Как сказал в комментариях Г.Г.Фило, рассмотрите возможность использования выделенной библиотеки для обработки файлов XML, наиболее известной из которых является lxml .
  2. Вы должны переставить свои for inputfile in... и with open(...) as out_file, чтобы не открывать / закрывать этот файл на каждой итерации
  3. Не используйте print(..., file=...), когда вы можете использовать out_file.write(...)

Хорошее начало, вы могли бы организовать это:

import glob
from lxml import etree

root = etree.Element("root")

with open ('D:\path\result\output.xml', 'w') as out_file:
    for inputfile in glob.glob('D:\path\to\scan\**\project_information.xml', recursive=True): 

        with open (inputfile, "r") as in_file:
            project = etree.SubElement(root, "project", path=in_file)
            # ... continue with your processing

    root.write(out_file, pretty_print=True)
...