【问题标题】:Parsing a xml.gz file in python在 python 中解析 xml.gz 文件
【发布时间】:2015-10-26 13:15:47
【问题描述】:

我的本​​地机器上有一个名为abc.aXML.gz 的tar.gz 文件,其中包含许多XML 文件。我想从这些文件中找到一些数据,但不知道如何使用Elementtreegzip 解析这些文件。

import xml.etree.ElementTree as ET
import gzip
document = ET.parse(gzip("abc.aXML.gz"))
root = document.getroot()

【问题讨论】:

标签: python xml gzip tar


【解决方案1】:

以下代码对我有用,可以读取和处理压缩的 xml 文件。
我先使用 gzip 解压文件,然后使用 ElementTree。

import gzip
import xml.etree.ElementTree as ET

input = gzip.open('input-xml.gz', 'r')
tree = ET.parse(input)
root = tree.getroot()

print root.tag
print root.attrib

【讨论】:

    【解决方案2】:

    从 tar 存档中读取 xml 文件:

    #!/usr/bin/env python
    import tarfile
    from contextlib import closing
    from xml.etree import ElementTree as etree
    
    with tarfile.open('xmls.tar.gz') as archive:
        for member in archive:
            if member.isreg() and member.name.endswith('.xml'): # regular xml file
                with closing(archive.extractfile(member)) as xmlfile:
                    root = etree.parse(xmlfile).getroot()
                    print(root)
                    # use root here..
    

    【讨论】:

      【解决方案3】:

      对我来说,以下代码有效:

      import gzip
      import cStringIO
      from lxml import etree
      from xml.dom import minidom
      
      path                = 'Some path ending in .xml.gz'
      a_tag_of_an_element = 'document'
      fakefile            = cStringIO.StringIO(gzip.open(path, 'rb').read())
      root                = etree.iterparse(fakefile, tag=a_tag_of_an_element)
      
      metr = 0
      for _, ch_tree in root:
          metr += 1
          the_tag = ch_tree.tag
          rough_string    =  etree.tostring(ch_tree, encoding='utf-8')
          reparsed        = minidom.parseString(rough_string)
          print(reparsed.toprettyxml(indent="\t"))
      
      print(metr)
      

      它迭代地解析xml文件而不从gz格式中提取它。

      【讨论】:

        【解决方案4】:

        更新

        要解析gzipped xml 文件,使用minidom parser,有两种选择:

        1. 交出指向xml文件的文件对象
        2. 以字符串形式交出全部内容

        [就效率而言,第二个是更强大的变体。]

        import gzip
        from xml.dom.minidom import parse, parseString
        
        # open and read gzipped xml file
        infile = gzip.open( abc.aXML.gz )
        content = infile.read()
        
        # parse xml file content
         dom = minidom.parseString(content)
        

        【讨论】:

        • 将最后一行更改为 dom = minidom.parseString(content) 对我有用
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-07
        • 2011-02-18
        • 2018-02-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多