[英]Writing Python XML ElementTree output to CSV
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 中得到 10 次與 XML“文件 10”相關的輸出,而不是 XML“文件 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。 到目前為止,這似乎有效。
典型的 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 中的輸出如下:
只需添加一個循環調用 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])
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.