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,有时可能会有更多监视器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的输出如下:
TL; DR现在,我可以在CSV中输出我想要的信息,但是我只是一遍又一遍地重复最后一个XML文件的数据。这是脚本的最新版本:import csv import glob ...
只需添加一个调用writerow的循环: