【问题标题】:A folder of Xml files to CsvXml 文件到 Csv 的文件夹
【发布时间】:2019-12-27 12:58:40
【问题描述】:

下面的代码获取一个 XML 文件并将其解析为 CSV 文件

import pandas as pd


def phones_to_df(fname):
    tree = cET.parse(fname)
    pd.DataFrame([{**{el.tag: el.text for el in list(phone)},
                   **{f'nuk_{k}': v for k, v in phone.find('nuk').items()}}
                  for phone in tree.iterfind('Phones')]).to_csv('export.csv', index=False)


if __name__ == '__main__':
    phones_to_df(fname="test.xml") 

xml文件如下

<Data xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Phones>
    <Date />
    <Prog />
    <Box />
    <Feature />
    <WIN>MAFWDS</WIN>
    <Set>234234</Set>
    <Pr>23423</Pr>
    <Number>afasfhrtv</Number>
    <Simple>dfasd</Simple>
    <Nr />
    <gt>6070106091</gt>
    <Reno>1233</Reno>
    <QW>3234</QW>
    <ER />
    <VR />
    <Use />
    <Dar>sdfsd</Dar>
    <age />
    <name1>sdfsfdfs</name1>
    <Sys>Itone</Sys>
    <aac>2014</aac>
    <time>02:00</time>
    <nuk name="This is some text" text_g="asadsdas" text_h="2">fsdfsfd3432fdf</nuk>
  </Phones>

</Data>

代码遍历 Phones 的元素并将它们打印到名为 test.xml

的 csv 文件中

现在,我正在尝试修改代码,而不是仅读取一个 xml 文件,而是转到一个文件夹并遍历其中的所有 xml 文件并将它们解析为一个单独的 Csv 文件。

我知道我必须导入

from pathlib import Path

所有xml文件所在文件夹的路径

xmls = [f for f in Path('C:/Users/Desktop/Original/test').glob('*.xml')] 

我正在努力研究如何将它实现到代码中并使其工作

【问题讨论】:

    标签: python pandas elementtree


    【解决方案1】:

    您可以为每个文件名调用您的函数,例如:

    pd.concat([phones_to_df(xml) for xml in xmls])
    

    使用每个 xml 文件名调用该函数将产生一个数据帧列表,并将与 pd.concat 连接,从而为您留下一个包含所有结果的数据帧。然后,您可以使用 to_csv 函数将其导出。

    总体上是这样的:

    import xml.etree.cElementTree as cET
    import pandas as pd
    from pathlib import Path
    
    def phones_to_df(fname):
        tree = cET.parse(fname)
        return pd.DataFrame([{**{el.tag: el.text for el in list(phone)},
                              **{f'nuk_{k}': v for k, v in phone.find('nuk').items()}}
                      for phone in tree.iterfind('Phones')])
    
    if __name__ == '__main__':
        xmls = [f for f in Path('C:/Users/Desktop/Original/test').glob('*.xml')] 
        df = pd.concat([phones_to_df(xml) for xml in xmls])
        df.to_csv("C:/Users/Desktop/Original/all.csv")
    

    【讨论】:

    • 谢谢你,也许我要求的太多了,但你能告诉我整个代码,你将如何在我现有的代码中实现它
    • 这是我尝试过的方法,但它不起作用controlc.com/a2fbacbf
    • 您是否有机会查看我在上面评论中发送的链接,我仍然无法使其工作
    • @ebe 你收到错误信息了吗?无论如何都应该删除第四行,因为还没有声明任何内容(所以删除导入后的第一行,pd.concat([phones_to_df(xml) for xml in xmls])
    • 我试过没有那行,我得到一个 ValueErorr: All objects pessed are none。我不明白的是为什么在 for 循环中我们保存到 csv 文件,然后再保存到 df.to_csv
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-27
    相关资源
    最近更新 更多