如何使用 Python 压缩创建. tar.gz 文件?
import tarfile tar = tarfile.open("sample.tar.gz", "w:gz") for name in ["file1", "file2", "file3"]: tar.add(name) tar.close()
如果要创建 tar.bz2压缩文件,只需将文件扩展名替换为“ . tar.bz2”,将“ w: gz”替换为“ w: bz2”。
使用 mode='w:gz'调用 Tarfile 打开,意思是“打开以便进行 gzip 压缩编写”
mode='w:gz'
您可能希望以 .tar.gz结束文件名(name参数到 open) ,但是这并不影响压缩能力。
.tar.gz
name
open
顺便说一句,你通常得到更好的压缩与 'w:bz2'的模式,就像 tar通常可以压缩甚至更好的 bzip2比它可以压缩与 gzip。
'w:bz2'
tar
bzip2
gzip
为整个目录树构建 .tar.gz(又名 .tgz) :
.tgz
import tarfile import os.path def make_tarfile(output_filename, source_dir): with tarfile.open(output_filename, "w:gz") as tar: tar.add(source_dir, arcname=os.path.basename(source_dir))
这将创建一个 gzip 压缩的 tar 归档文件,其中包含一个顶级文件夹,其名称和内容与 source_dir相同。
source_dir
以前的答案建议使用 tarfile Python 模块在 Python 中创建 .tar.gz文件。这显然是一个很好的 Python 风格的解决方案,但它在归档速度方面存在严重缺陷。这个问题提到 tarfile大约比 Linux 中的 tar实用程序慢两倍。根据我的经验,这个估计是相当正确的。
tarfile
因此,为了更快地归档,您可以使用 subprocess模块的 tar命令:
subprocess
subprocess.call(['tar', '-czf', output_filename, file_to_archive])
在这里 Gz 文件压缩在 open view 目录中 在解决方案中使用 os.path.basename (file _ directory)
import tarfile with tarfile.open("save.tar.gz","w:gz") as tar: for file in ["a.txt","b.log","c.png"]: tar.add(os.path.basename(file))
它在 tar.gz 文件压缩目录中的使用
除了@Aleksandr Tukallo 的回答之外,您还可以获得输出和错误消息(如果发生)。使用 tar压缩文件夹在 以下回答中有很好的解释。
import traceback import subprocess try: cmd = ['tar', 'czfj', output_filename, file_to_archive] output = subprocess.check_output(cmd).decode("utf-8").strip() print(output) except Exception: print(f"E: {traceback.format_exc()}")
更正@THAVASI。T 的回答忽略了显示‘ tarfile’库的导入,并且没有定义第三行中使用的‘ tar’对象。
最好的性能和没有 .和 ..在压缩文件
.
..
注意 (感谢 MaxTruxa) : 这个答案很容易受到外壳注射的影响。请从文件中读出 安全考虑。如果是 shell=True,则不要将未转义的字符串传递给 subprocess.run、 subprocess.call等。使用 shlex.quote转义(仅 Unix shell)。 我在本地使用它 -所以它对我的需求很有帮助。
注意 (感谢 MaxTruxa) :
这个答案很容易受到外壳注射的影响。请从文件中读出 安全考虑。如果是 shell=True,则不要将未转义的字符串传递给 subprocess.run、 subprocess.call等。使用 shlex.quote转义(仅 Unix shell)。
shell=True
subprocess.run
subprocess.call
shlex.quote
我在本地使用它 -所以它对我的需求很有帮助。
subprocess.call(f'tar -cvzf {output_filename} *', cwd=source_dir, shell=True)
cwd参数在压缩之前改变目录-这解决了点的问题。
cwd
shell=True允许使用通配符(*)
*
WORKS 也适用于递归目录
Make _ archive 对于文件和目录都非常方便(内容递归地添加到存档中) :
import shutil compressed_file = shutil.make_archive( base_name='archive', # archive file name w/o extension format='gztar', # available formats: zip, gztar, bztar, xztar, tar root_dir='path/to/dir' # directory to compress )