Как прочитать и перечислить файл tgz в python3? - PullRequest
0 голосов
/ 01 июля 2019

В python 3 (3.6.8) я хочу прочитать tar-файл в формате gzip и перечислить его содержимое.

Я нашел это решение , которое выдает ошибку

UnicodeDecodeError: 'utf-8' codec can't decode byte 0x8b in position 1: invalid start byte

Поиск этой ошибки в найденном этом предложении , поэтому я попробовал следующий фрагмент кода:

with open(out_file) as fd:
    gzip_fd = gzip.GzipFile(fileobj=fd)
    tar = tarfile.open(gzip_fd.read())

, которая выдает ту же ошибку!

Так как это сделать правильно?

Даже при просмотре фактической документации здесь я придумал следующий код:

tar = tarfile.open(out_file, "w:gz")
for member in tar.getnames():
   print(tar.extractfile(member).read())

, который наконец-то сработал без ошибок - но не распечатал содержимое архива tar на экране!

Файл tar хорошо отформатирован и содержит папки и файлы. (Мне нужно попытаться поделиться этим файлом)

Ответы [ 3 ]

0 голосов
/ 01 июля 2019

Модуль python-архива (доступный на pip) может помочь вам:

from archive import extract

file = "you/file.tgz"
try:
    extract(file, "out/%s.raw" % (file), ext=".tgz")
except:
    # could not extract
    pass

Доступные расширения: (v0.2): «.zip», «.egg», «.jar», «.tar», «.tar.gz», «.tgz», «.tar.bz2». , '.tz2'

Подробнее: https://pypi.org/project/python-archive/

0 голосов
/ 01 июля 2019

Не знаю, почему это не сработало раньше, но у меня работает следующее решение, чтобы вывести список файлов и папок архива gzipped tar с python 3.6 :

tar = tarfile.open(filename, "r:gz")
print(tar.getnames())
0 голосов
/ 01 июля 2019

Когда вы open файл без указания mode, по умолчанию он читается как текст. Вам нужно открыть файл как необработанный поток байтов, используя флаг mode='rb', а затем передать его в gzip reader

with open(out_file, mode='rb') as fd:
    gzip_fd = gzip.GzipFile(fileobj=fd)
    tar = tarfile.open(gzip_fd.read())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...