Я хочу создать файл script для unzip (.tar.gz) через (Python)

Я пытаюсь сделать script для распаковки всех файлов .tar.gz из папок в одном каталоге. Например, у меня будет файл, который он вызывает (testing.tar.gz). Затем, если я сделаю это вручную, я могу нажать "извлечь здесь", тогда файл .tar.gz создаст новый файл и вызовет test.tar. Наконец, если я повторю процесс нажатия "extract here", файл .tar расшифровывает все файлы .pdf.

Интересно, как я могу это сделать, и у меня есть мой код здесь, и кажется, что это не работает.

import os
import tarfile
import zipfile

def extract_file(path, to_directory='.'):
    if path.endswith('.zip'):
        opener, mode = zipfile.ZipFile, 'r'
    elif path.endswith('.tar.gz') or path.endswith('.tgz'):
        opener, mode = tarfile.open, 'r:gz'
    elif path.endswith('.tar.bz2') or path.endswith('.tbz'):
        opener, mode = tarfile.open, 'r:bz2'
    else: 
        raise ValueError, "Could not extract `%s` as no appropriate extractor is found" % path

    cwd = os.getcwd()
    os.chdir(to_directory)

    try:
        file = opener(path, mode)
        try: file.extractall()
        finally: file.close()
    finally:
        os.chdir(cwd)

Ответ 1

Почему вы хотите "нажать" дважды, чтобы извлечь .tar.gz, если вы легко можете сделать это один раз? Вот простой код для извлечения .tar и .tar.gz за один раз:

import tarfile
if (fname.endswith("tar.gz")):
    tar = tarfile.open(fname, "r:gz")
    tar.extractall()
    tar.close()
elif (fname.endswith("tar")):
    tar = tarfile.open(fname, "r:")
    tar.extractall()
    tar.close()

Ответ 2

Если вы используете Python 3, вы должны использовать shutil.unpack_archive, который подходит для большинства распространенных форматов архивов.

shutil.unpack_archive(filename[, extract_dir[, format]])

Распакуйте архив. имя файла - полный путь к архиву.    extract_dir - имя целевого каталога, в который распаковывается архив. Если не указан, используется текущий рабочий каталог.

Например:

def extract_all(archives, extract_path):
    for filename in archives:
        shutil.unpack_archive(filename, extract_path)

Ответ 3

Когда я запустил вашу программу, она отлично работала для tar.gz и файла .tgz, не открывала правильных элементов при открытии zip, но только .tbz вызвала ошибку. Я думаю, что вы использовали неправильный метод для распаковки .tbz, потому что ошибка сказала, что у меня был неправильный тип файла, но я этого не сделал. Одним из способов решения проблемы .zip является использование os.command() и распаковка его с помощью командной строки (в зависимости от вашей ОС), поскольку она вернула папку _MACOSX, в которой ничего не было, даже если я правильно ввел путь. Единственной другой ошибкой, с которой я столкнулся, было то, что вы использовали неправильный синтаксис для выдачи ошибки.
Это то, что вы должны были использовать:

raise ValueError("Error message here")

Вы использовали запятую и без скобок. Надеюсь это поможет!

Ответ 4

Вы можете выполнить скрипт оболочки из Python, используя envoy:

import envoy # pip install envoy

if (file.endswith("tar.gz")):
    envoy.run("tar xzf %s -C %s" % (file, to_directory))

elif (file.endswith("tar")):
    envoy.run("tar xf %s -C %s" % (file, to_directory))

Ответ 5

Использование контекстного менеджера:

import tarfile
<another code>
with tarfile.open(os.path.join(os.environ['BACKUP_DIR'],
                  f'Backup_{self.batch_id}.tar.gz'), "r:gz") as so:
    so.extractall(path=os.environ['BACKUP_DIR'])