将 Python XML ElementTree 输出写入 CSV
Writing Python XML ElementTree output to CSV
长话短说;博士
我现在可以在 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 中引用 "Matrix Switch" 以及何时引用它感兴趣。有时可能只有一个监视器 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" 命令添加到处理监视器 ID 和摄像机 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 中的输出如下:
只需添加一个调用 writerow 的循环:
...
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 中输出我想要的信息,但我只是一遍又一遍地重复最后一个 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 中引用 "Matrix Switch" 以及何时引用它感兴趣。有时可能只有一个监视器 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" 命令添加到处理监视器 ID 和摄像机 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 中的输出如下:
只需添加一个调用 writerow 的循环:
...
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])