首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多层XML到CSV

多层XML到CSV
EN

Stack Overflow用户
提问于 2022-06-23 06:40:10
回答 1查看 93关注 0票数 0

我很难找到通过python将XML文件转换为CSV的方法。这个文件有多个属性,我需要在dataframe中拥有这些属性。以下是XML文件的示例:

代码语言:javascript
复制
<helpdesk-tickets type="array">
---<helpdesk-ticket>
------<account-id type="integer">123</account-id>
---<notes type="array">
------<helpdesk-note>
---------<body>content 1 I need</body>
------</helpdesk-note>
------<helpdesk-note>
---------<body>content 2 I need</body>
------</helpdesk-note>
---</notes>
---</helpdesk-ticket>
---<helpdesk-ticket>
------<account-id type="integer">456</account-id>
---<notes type="array">
------<helpdesk-note>
---------<body>content 3 I need </body>
------</helpdesk-note>
------<helpdesk-note>
---------<body>content 4 I need </body>
------</helpdesk-note>
---</notes>
---</helpdesk-ticket>
</helpdesk-tickets>

这是我的密码:

代码语言:javascript
复制
import xml.etree.ElementTree as Xet
import pandas as pd
  
cols = ["account-id","notes"]
rows = []
  
xmlparse = Xet.parse('E:\python\Tickets132.xml')
root = xmlparse.getroot()

for i in root:
    display_id = i.find("account-id").text
  
for att in root.findall('./helpdesk-ticket/notes/helpdesk-note'):
    notes2 = att.find("body").text 
    
    
    rows.append({
                "account-id": display_id,
                "notes" : notes2,
                })
  
df91 = pd.DataFrame(rows, columns=cols)
display (df91)
df91.to_csv('output21.csv')

我得到的是:

代码语言:javascript
复制
account-id  notes
0   123 content 1 I need
1   123 content 2 I need
2   123 content 3 I need
3   123 content 4 I need

预期产出:

代码语言:javascript
复制
account-id  notes
    0   123 content 1 I need
    1   123 content 2 I need
    2   456 content 3 I need
    3   456 content 4 I need

提前感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-06-23 07:25:23

问题是,您首先在整个文件上迭代帐户id,然后再使用迭代。你需要嵌套循环。

这应该是可行的:

代码语言:javascript
复制
import xml.etree.ElementTree as Xet
import pandas as pd

cols = ["account-id", "notes"]
rows = []

xmlparse = Xet.parse('E:\python\Tickets132.xml')
root = xmlparse.getroot()

for helpdesk_ticket in root.findall("./helpdesk-ticket"):   # iteration over every helpdesk_ticket
    display_id = helpdesk_ticket.find("account-id").text    # save account-id

    for helpdesk_note in helpdesk_ticket.findall(".//helpdesk-note"):    # find every helpdesk-note in iterated helpdesk_ticket
        notes2 = helpdesk_note.find("./body").text   # find body text
        rows.append({
            "account-id": display_id,
            "notes": notes2,
        })

df91 = pd.DataFrame(rows, columns=cols)
display(df91)
df91.to_csv('output21.csv')
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72725615

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档