Разбор файла 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

ОБНОВЛЕНО

Чтобы проанализировать сжатый gzml-файл, используйте парсер 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