我想通过(Python)为 unzip (. tar.gz)文件创建一个脚本

我正在尝试编写一个脚本来解压所有。Gz 文件来自一个目录中的文件夹。例如,我将有一个它调用的文件(testing.tar.gz)。然后,如果我手动做,我可以按“提取这里”,然后。Gz 文件将创建一个新文件,并调用 testing.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)
146581 次浏览

Why do you want to "press" twice to extract a .tar.gz, when you can easily do it once? Here is a simple code to extract both .tar and .tar.gz in one go:

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()

When I ran your program, it worked perfectly for a tar.gz and a .tgz file, it didn't give me the correct items when I opened the zip, but .tbz was the only one that raised an error. I think you used the wrong method to unpack a .tbz because the error said I had an incorrect file type, but I didn't. One way you could solve the .zip issue is to us os.command() and unzip it with a command line (depending on your os) because it returned a _MACOSX folder with nothing inside of it even though I entered the path correctly. The only other error I encountered was that you used improper syntax for raising an error.
This is what you should have used:

raise ValueError("Error message here")

You used a comma and no parenthesis. Hope this helps!

You can execute a shell script from Python using 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))

If you are using python 3, you should use shutil.unpack_archive that works for most of the common archive format.

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

Unpack an archive. filename is the full path of the archive. extract_dir is the name of the target directory where the archive is unpacked. If not provided, the current working directory is used.

For example:

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

Using context manager:

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'])

In case you are using a python in jupyter-notebook and in a linux machine, the below will do:

!tar -xvzf /path/to/file.tar.gz -C /path/to/save_directory

! enables the command to be run in the terminal.

The following worked for me for a .tar.gz file. It will extract files in your specified destination:

import tarfile


from os import mkdir
from os.path import isdir


src_path = 'path/to/my/source_file.tar.gz'
dst_path = 'path/to/my/destination'


# create destination dir if it does not exist
if isdir(dst_path) == False:
mkdir(dst_path)


if src_path.endswith('tar.gz'):
tar = tarfile.open(src_path, 'r:gz')
tar.extractall(dst_path)
tar.close()