Python使用Python pandas将xml转换为csv

2024-09-28 04:49:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我是新来的,我一直在尝试创建一个小python脚本来将xml转换为csv。根据我在Stackoverflow上阅读的各种帖子,我设法想出了一个可以正常工作的示例代码。。然而,我试图处理的数据有多个层次,因此我不确定如何在叶级提取数据。在

以下是数据的外观:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Transmission>
    <TransmissionBody>
        <level1>
            <level2>
                <level3>
                    <level4>
                        <level5>
                            <level6>
                                <ColA>ABC</ColA>
                                <ColB>123</ColB>
                            </level6>
                        </level5>
                    </level4>
                </level3>
            </level2>
        </level1>
    </TransmissionBody>
</Transmission>

我尝试使用下面的代码尝试将xml转换为csv

^{pr2}$

然而,这个代码只是从第二层提取,而不是从第六层提取可乐。在

预期输出

Transmission,TransmissionBody,level1,level2,level3,level4,level5,level6,ColA,ColB
,,,,,,,,ABC,123
,,,,,,,,DEF,456

更新代码

allFiles = glob.glob(folder)
for file in allFiles:
    xmllist = [file]
    for xmlfile in xmllist:
        tree = ET.parse(xmlfile)
        root = tree.getroot()

        def f(elem, result):
            result[elem.tag] = elem.text
            cs = elem.getchildren()
            for c in cs:
                result = f(c, result)
            return result

         d = f(root, {})
         df = pd.DataFrame(d, index=['values'])

Tags: 数据代码xmlresulttransmissionlevel3elemcolb
2条回答

你有缩进问题

if len(elem):

我想这应该能解决问题。在

如果我正确地理解了您的问题,那么您需要遍历XML树,所以您可能希望有一个递归函数来完成这个任务。如下所示:

import pandas as pd
import xml.etree.ElementTree as ET

tree = ET.parse('file.xml')
root = tree.getroot()

def f(elem, result):
    result[elem.tag] = elem.text
    cs = elem.getchildren()
    for c in cs:
        result = f(c, result)
    return result

d = f(root, {})
df = pd.DataFrame(d, index=['values']).T
df

输出:

^{pr2}$

更新: 我们需要在多个XML文件上执行此操作。我添加了另一个类似于原始文件的ColA,ColB行替换为

<ColA>DEF</ColA>
<ColB>456</ColD>

代码如下:

def f(elem, result):
    result[elem.tag] = elem.text
    cs = elem.getchildren()
    for c in cs:
        result = f(c, result)
    return result

result = {}
for file in glob.glob('*.xml'):
    tree = ET.parse(file)
    root = tree.getroot()
    result = f(root, result)

df = pd.DataFrame(result, index=['values']).T
df

以及输出:

                    0    1
Transmission       \n   \n
TransmissionBody   \n   \n
level1             \n   \n
level2             \n   \n
level3             \n   \n
level4             \n   \n
level5             \n   \n
level6             \n   \n
ColA              ABC  DEF
ColB              123  456

相关问题 更多 >

    热门问题