将Python XML ElementTree输出输出为CSV

问题描述 投票:0回答:1

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文件,我在CSV中获得了与XML“ File 10”相关的输出10次,而不是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])

我正在寻找以下数据:

  • XML文件名
  • 宏名
  • 显示器ID
  • 摄像机ID
  • 我只对XML中的“矩阵切换”感兴趣,并且在其中。有时可能只有一个监视器ID和一个摄像机ID,有时可能会有更多监视器ID,因此脚本需要遍历并获取“ Matrix Switch”元素中的所有ID。到目前为止,这似乎可行。

典型的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”命令添加到处理Monitor ID和Camera ID的循环中。

我希望我的CSV显示:名称,文件名,监视器A,摄像机A,监视器B,摄像机B,监视器C,摄像机C,监视器D,摄像机D等...。

任何指针都非常感谢!

现在代码已稍作更改:

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

TL; DR现在,我可以在CSV中输出我想要的信息,但是我只是一遍又一遍地重复最后一个XML文件的数据。这是脚本的最新版本:import csv import glob ...

python csv elementtree
1个回答
0
投票

只需添加一个调用writerow的循环:

© www.soinside.com 2019 - 2024. All rights reserved.