簡體   English   中英

將 Python XML ElementTree 輸出寫入 CSV

[英]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

我只對 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 中的輸出如下:

https://imgur.com/a/SrPrgjm

只需添加一個循環調用 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM