Разбор на файл xml.gz в python

Имам файл tar.gz на моята локална машина, наречен abc.aXML.gz, който съдържа много XML файлове. Искам да намеря някои данни от тези файлове, но не знам как да анализирам тези файлове с помощта на Elementtree и gzip.

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

person shahbaz khan    schedule 26.10.2015    source източник
comment
Възможен дубликат на Как да анализирам XML в Python?   -  person Shahzad    schedule 26.10.2015
comment
това не е .gz файл   -  person shahbaz khan    schedule 26.10.2015
comment
имаш предвид, че имаш tar.gz (забележка: tar) архив, който съдържа множество файла? Един gzip архив може да съдържа само един файл.   -  person jfs    schedule 26.10.2015
comment
да..моят файл е tar.gz   -  person shahbaz khan    schedule 26.10.2015
comment
Редактирах въпроса ви за яснота и четливост.   -  person user3071284    schedule 28.10.2015


Отговори (4)


Кодът по-долу работи за мен, за да прочета и обработя компресиран 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
person upkar    schedule 23.07.2019

За да прочетете xml файлове от tar архив:

#!/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..
person jfs    schedule 26.10.2015

За мен следният код работи:

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 формата.

person Δημητρης Παππάς    schedule 30.10.2018

АКТУАЛИЗИРАНО

За да анализирате gzipped xml файл, използвайте minidom парсер, има две опции:

  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)
person Shahzad    schedule 26.10.2015
comment
Промяната на последния ред на dom = minidom.parseString(content) работи за мен - person anish; 24.04.2019