Запись Python XML ElementTree вывода в CSV - PullRequest
0 голосов
/ 25 марта 2020

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

1 Ответ

0 голосов
/ 25 марта 2020

Просто добавьте oop вызывающего писателя:

...
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])
...