Используйте gzip с архивом с несколькими файлами в Python 3 - PullRequest
0 голосов
/ 03 июня 2018

Итак, в основном у меня есть такая файловая система:

main_archive.tar.gz
  main_archive.tar
    sub_archive.xml.gz
      actual_file.xml

В этом архиве сотни файлов ... Так что в принципе можно ли использовать пакет gzip с несколькими файлами в Python 3?Я использовал его только с одним заархивированным файлом, поэтому я не знаю, как просмотреть несколько файлов или несколько уровней «заархивирования».

Мой обычный метод распаковки:

with gzip.open(file_path, "rb") as f:
  for ln in f.readlines():
    *decode encoding here*

Конечно, у этого есть несколько проблем, потому что обычно "f" - это просто файл ... Но теперь я не уверен, что он представляет?

Любая помощь / совет будет высоко ценится!

РЕДАКТИРОВАТЬ 1:

Я принял ответ ниже, но если вы ищете похожий код, моя магистраль была в основном:

tar = tarfile.open(file_path, mode="r")
for member in tar.getmembers():
    f = tar.extractfile(member)
    if verbose:
        print("Decoding", member.name, "...")
    with gzip.open(f, "rb") as temp:
        decoded = temp.read().decode("UTF-8")
        e = xml.etree.ElementTree.parse(decoded).getroot()
        for child in e:
            print(child.tag)
            print(child.attrib)
            print("\n\n")

tar.close()

Основные используемые пакетыбыли gzip, tarfile и xml.etree.ElementTree.

Ответы [ 2 ]

0 голосов
/ 03 июня 2018

gzip поддерживает сжатие только одного файла или потока.В вашем случае извлеченный поток является объектом tar, поэтому вы можете использовать библиотеку Python tarfile для управления извлеченным содержимым.Эта библиотека действительно знает, как справиться с .tar.gz, поэтому вам не нужно явно извлекать gzip самостоятельно.

0 голосов
/ 03 июня 2018

Используйте tar-файл Python, чтобы получить содержащиеся в нем файлы, а затем снова выполните gzip Python внутри цикла, чтобы извлечь xml.

...