Python Сценарий ElementTree, дублирующий данные XML при записи в выходной файл CSV - PullRequest
1 голос
/ 26 марта 2020

У меня есть скрипт, который берет папку с файлами XML, ищет в них определенный элемент c и затем печатает содержимое элемента (идентификаторы монитора и идентификаторы камеры) в CSV. Достаточно просто, однако существует проблема, когда данные в CSV дублируются.

Кажется, что в зависимости от того, сколько элементов найдено в элементе MatrixSwitch, это количество повторений данных в CSV.

Скажем, у XML есть только 1 «Монитор» и 1 «Камера», эти данные будут продублированы 2 раза. Если в следующем файле по 3 файла, всего 6, это будет повторяться 6 раз.

Это сценарий:

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', 'a', newline='') as file:

            writer = csv.writer(file)
            writer.writerow([root.attrib, filename])
            for i in e:
                writer.writerow([i.tag, i.text])

Я распечатал «имена файлов», чтобы посмотреть, что-то вызывало проблему, но, похоже, нет, ни одно из имен файлов не показывалось в списке как дублированные.

Ожидаемый вывод из каждого файла XML, отображаемого в CSV, выглядит следующим образом: https://imgur.com/a/SrPrgjm

Ясно, что одна из петель как-то запуталась, но я изо всех сил пытаюсь ее найти.

Пример 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>

Из-за вложенных циклов у меня теперь есть следующее, которое, кажется, работает нормально:

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/')
    with open('results.csv', 'a', newline='') as file:
        writer = csv.writer(file)
        writer.writerow([root.attrib, filename])

        for i in e:
            print (i.tag, i.text)
            writer.writerow([i.tag, i.text])

...