Я хочу создать файл 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'])