【问题标题】:How to parse through XML and convert to CSV using Python如何通过 XML 解析并使用 Python 转换为 CSV
【发布时间】:2015-06-16 22:42:32
【问题描述】:

我对 Python 编程很陌生。我们最近进入了一个项目,我需要将 XML 文档转换为文本或 CSV 格式,以便我们可以将其加载到 Hadoop 并通过 Impala 呈现给用户。下面是一个示例 XML,我正在寻找如下所示的输出格式。我讨厌直接寻求帮助,但由于这对我来说是全新的,因此请与您的专家联系。

示例 XML:

<?xml version="1.0" encoding="ISO-8859-1" ?>
<GISF XMLNS="TOOL.COM">
   <HEADER>
      <FILE_NAME>TOY.xml</FILE_NAME>
      <DATE>20130611</DATE>
      <TIME>14:02:00</TIME>
   </HEADER>
<ISSUER>
   <ID>123456</ID>
   <INS>
      <INS_ID>34685</INS_ID>
      <SERIES></SERIES>
      <MAT>
         <MAT_ID>2233445566</MAT_ID>
         <C_TYPE>BCG</C_TYPE>
         <COL_TYPE></COL_TYPE>
         <MAT_RAT_GR>
            <RGC>STR</RGC>
            <MAT_RA>
               <TYPE>FC</TYPE>
               <RAT>GGG</RAT>
            </MAT_RA>
            <MAT_RA>
               <TYPE>FC2</TYPE>
               <RAT>GGG2</RAT>
            </MAT_RA>
         </MAT_RAT_GR>
         <IDENTIFIER NAME="ABCD" VALUE="GOR345"></IDENTIFIER>
         <IDENTIFIER NAME="EFGH" VALUE="QELH7876"></IDENTIFIER>
      </MAT>
   </INS>
</ISSUER>
<ISSUER>
   <ID>777888</ID>
   <INS>
      <INS_ID>444555</INS_ID>
      <SERIES></SERIES>
      <MAT>
         <MAT_ID>444555666</MAT_ID>
         <C_TYPE>BCD</C_TYPE>
         <COL_TYPE></COL_TYPE>
         <MAT_RAT_GR>
            <RGC>STR</RGC>
            <MAT_RA>
               <TYPE>FC3</TYPE>
               <RAT>GGG4</RAT>
            </MAT_RA>
         </MAT_RAT_GR>
         <IDENTIFIER NAME="ABCD" VALUE="GOR345"></IDENTIFIER>
         <IDENTIFIER NAME="EFGH" VALUE="QELH7876"></IDENTIFIER>
      </MAT>
   </INS>
</ISSUER>
</GISF>

预期输出:

ID           INS_ID       MAT_ID           TYPE       RAT

123456    ,   34685   ,    2233445566  ,      FC    ,     GGG
123456    ,   34685   ,    2233445566  ,      FC2    ,    GGG2
777888    ,   444555  ,    444555666   ,      FC3    ,    GGG4

我尝试了下面的脚本,它以 csv 格式给我输出。但我真的认为有更好的方法来做到这一点,因为我手动遍历不同的级别并硬编码标签名称。

import xml.etree.ElementTree as ET
tree = ET.parse("GISF.xml")
root = tree.getroot()
for ISSUER in root.findall('ISSUER'):
    Iss_id = ISSUER.find('ID').text   
    for INSTRUMENT in ISSUER.findall('INS'):
        ins_id = INSTRUMENT.find('INS_ID').text
            for MATURITY in INSTRUMENT.findall('MAT'):
            may_id = MATURITY.find('MAT_ID').text
            line = Iss_id+','+ins_id+','+may_id
            print (line)

生成的输出:

    123456,34685,2233445566
    777888,444555,444555666

【问题讨论】:

  • 你有没有尝试过什么?
  • @mehtunguh :我附上了迄今为止我尝试过的代码。我认为到目前为止我所拥有的是一种基本的实施方式。我想知道是否有一种方法可以一次遍历树的所有级别并打印行,而不是为每个级别编写 FOR 循环。

标签: python xml csv hadoop elementtree


【解决方案1】:

https://pypi.python.org/pypi/xmlutils

这是一个很好的起点。

【讨论】:

    猜你喜欢
    • 2021-10-29
    • 2021-10-21
    • 2013-06-16
    • 1970-01-01
    • 1970-01-01
    • 2015-09-05
    • 2021-07-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多