TL; DR Теперь я могу выводить нужную информацию в CSV, но я просто повторяю данные последнего XML файла снова и снова.
Это последняя версия сценарий:
import csv
import glob
import xml.etree.ElementTree as ET
filenames = glob.glob("..\Lib\macros\*.xml")
for filename in filenames:
with open(filename, 'r') as content:
element = ET.parse(content)
root = element.getroot()
print(root.attrib, filename)
e = element.findall('commands/MatrixSwitch/')
for i in e:
print (i.tag, i.text)
with open('results.csv', 'w', newline='') as file:
for filename in filenames:
writer = csv.writer(file)
writer.writerow([root.attrib, filename])
for i in e:
writer.writerow([i.tag, i.text])
Скажем, у меня есть 10 XML файлов, я получаю вывод, связанный с XML "File 10" 10 раз в CSV, но ничего для XML "File 1-9 "... уверен, что-то простое?
=============================== =========================================
Я имею написал небольшой скрипт, который принимает папку с файлами XML, ищет определенный элемент и затем возвращает некоторые данные. Затем он выводится на консоль и записывается в CSV, за исключением того, что у меня возникают проблемы с правильным форматированием моего CSV.
Вот где я дошел:
import csv
import glob
import xml.etree.ElementTree as ET
filenames = glob.glob("..\Lib\macros\*.xml")
for filename in filenames:
with open(filename, 'r') as content:
element = ET.parse(content)
root = element.getroot()
print(root.attrib, filename)
e = element.findall('commands/MatrixSwitch/')
for i in e:
print (i.tag, i.text)
with open('results.csv', 'w', newline='') as file:
writer = csv.writer(file)
writer.writerow([root.attrib, filename])
I Снимаю следующие данные:
- XML Имя файла
- Имя макроса
- Идентификатор монитора
- Идентификатор камеры
Меня интересует только то, когда "Матричный коммутатор" упоминается в XML. Иногда может быть только один идентификатор монитора и один идентификатор камеры, иногда их может быть больше, поэтому сценарию необходимо выполнить l oop и получить все идентификаторы в элементе «Матричный коммутатор». Это, кажется, работает до сих пор.
Типичная XML структура выглядит так:
<macro name="NAME OF THE MACRO IS SHOWN HERE">
<execution>
<delay>0</delay>
</execution>
<parameters/>
<commands>
<MatrixSwitch>
<camera>1530</camera>
<monitor>1020</monitor>
</MatrixSwitch>
<MatrixSwitch>
<camera>1531</camera>
<monitor>1001</monitor>
</MatrixSwitch>
</commands>
</macro>
Или вот так:
<macro name="ANOTHER NAME GOES HERE">
<execution>
<delay>0</delay>
</execution>
<parameters/>
<commands>
<MatrixSwitch>
<camera>201</camera>
<monitor>17</monitor>
</MatrixSwitch>
<MatrixSwitch>
<camera>206</camera>
<monitor>18</monitor>
</MatrixSwitch>
<MatrixSwitch>
<camera>202</camera>
<monitor>19</monitor>
</MatrixSwitch>
<MatrixSwitch>
<camera>207</camera>
<monitor>20</monitor>
</MatrixSwitch>
</commands>
</macro>
Мой текущий файл results.csv только для вывода имени и имени файла. Это работает, но я не уверен, где мне нужно добавить команду «Writer» в l oop, где она имеет дело с идентификатором монитора и идентификатором камеры.
Я хочу, чтобы мой CSV показывал: Имя, Имя файла , Монитор A, камера A, монитор B, камера B, монитор C, камера C, монитор D, камера D et c .....
Любые указатели очень ценятся !!
Код был слегка изменен:
import csv
import glob
import xml.etree.ElementTree as ET
filenames = glob.glob("..\Lib\macros\*.xml")
for filename in filenames:
with open(filename, 'r') as content:
element = ET.parse(content)
root = element.getroot()
print(root.attrib, filename)
e = element.findall('commands/MatrixSwitch/')
for i in e:
print (i.tag, i.text)
with open('results.csv', 'w', newline='') as file:
writer = csv.writer(file)
writer.writerow([root.attrib, filename])
for i in e:
writer.writerow([i.tag, i.text])
Вывод в CSV следующий:
https://imgur.com/a/SrPrgjm