Архив Untar в Python с ошибками

Я загружаю файл bz2, используя Python. Затем я хочу распаковать архив, используя:

def unpack_file(dir, file):
    cwd = os.getcwd()
    os.chdir(dir)
    print "Unpacking file %s" % file
    cmd = "tar -jxf %s" % file
    print cmd
    os.system(cmd)
    os.chdir(cwd)

К сожалению, это заканчивается ошибкой:

bzip2: Compressed file ends unexpectedly;
    perhaps it is corrupted?  *Possible* reason follows.
bzip2: Inappropriate ioctl for device
    Input file = (stdin), output file = (stdout)

It is possible that the compressed file(s) have become corrupted.
You can use the -tvv option to test integrity of such files.

You can use the `bzip2recover' program to attempt to recover
data from undamaged sections of corrupted files.

tar: Nieoczekiwany EOF w archiwum
tar: Nieoczekiwany EOF w archiwum
tar: Error is not recoverable: exiting now

Однако я могу без проблем распаковать архив из оболочки.

У вас есть идеи, что я делаю не так?

2 ответа

Решение

Для справки, стандартная библиотека python поставляется с модулем tarfile, который автоматически обрабатывает форматы tar, tar.bz2 и tar.gz.

Кроме того, вы можете делать изящные вещи, такие как получать списки файлов, извлекать подмножества файлов или каталогов или разбивать архив на части, чтобы обработать его в потоковой форме (т.е. вам не нужно распаковывать весь файл, а затем распаковывать его). все небольшими порциями)

import tarfile
tar = tarfile.open("sample.tar.gz")
tar.extractall()
tar.close()

Я бы сделал это так:

import tarfile
target_folder = '.'
with tarfile.open("sample.tar.gz") as tar:
    tar.extractall(target_folder)

Вот и все. tar / with заботится об остальном.

Если вы хотите иметь путь ко всем файлам:

import os
filepaths = []
for (dirpath, dirnames, filenames) in walk(target_folder):
    filepaths.extend([os.path.join(dirpath, f) for f in filenames])
Другие вопросы по тегам