Python ElementTree脚本在写入CSV输出时复制XML数据

2024-05-11 05:47:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个脚本,它获取一个XML文件文件夹,在其中搜索特定元素,然后将元素的内容(监视器ID和摄像机ID)打印到CSV。很简单,但是CSV中的数据存在重复问题

看起来,这是CSV中重复数据的次数,取决于MatrixSwitch元素中找到的项目数

假设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])

我打印了“文件名”以查看这是否是导致问题的原因,但似乎不是,列表中没有显示重复的文件名

CSV中显示的每个XML文件的预期输出如下所示: 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])


Tags: csvinimportforasrootxmlelement