У меня есть скрипт, который берет папку с файлами 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])