У меня есть скрипт, который рекурсивно копается в заданный каталог, выкапывает все файлы с определенным именем и помещает содержимое всех найденных файлов в один файл.
Сценарий работает так, как мне нужно, в плане поиска файлов и вывода всего содержимого в один 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')