140

如何在 Python 中创建带有压缩的 .tar.gz 文件?

4

8 回答 8

245

为整个目录树构建.tar.gz(又名):.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))

这将创建一个 gzipped tar 存档,其中包含一个顶级文件夹,其名称和内容与source_dir.

于 2013-06-13T06:58:45.260 回答
101
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”。

于 2010-01-09T05:17:44.973 回答
32

你用 调用tarfile.openmode='w:gz'意思是“为 gzip 压缩写入打开”。

您可能希望以 结束文件名( 的name参数open.tar.gz,但这不会影响压缩能力。

顺便说一句,您通常使用 模式获得更好的压缩'w:bz2',就像通常可以压缩比tar使用 压缩更好。bzip2gzip

于 2010-01-09T05:19:07.197 回答
20

以前的答案建议使用tarfilePython 模块在 Python 中创建.tar.gz文件。这显然是一个很好的 Python 风格的解决方案,但它在归档速度方面存在严重缺陷。这个问题提到这比Linux 中的实用程序tarfile慢大约两倍。tar根据我的经验,这个估计是非常正确的。

因此,为了更快地归档,您可以使用以下tar命令使用subprocess模块:

subprocess.call(['tar', '-czf', output_filename, file_to_archive])
于 2019-07-19T11:55:09.790 回答
3

除了@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()}")       
于 2020-03-15T22:42:48.697 回答
0

在这个 tar.gz 文件中压缩在打开的视图目录中解决使用 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 文件中的使用 压缩在目录中

于 2019-09-08T17:42:34.397 回答
0

完美答案

最好的性能,并且没有.压缩..文件!

subprocess.call(f'tar -cvzf {output_filename} *', cwd=source_dir, shell=True)

参数在cwd压缩之前更改目录 - 这解决了点的问题。

允许使用shell=True通配符 ( *)

WORKS 也适用于递归目录

于 2021-08-25T14:05:40.777 回答
0

对@THAVASI.T 的答案进行了较小的更正,其中省略了显示“tarfile”库的导入,并且没有定义第三行中使用的“tar”对象。

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))
于 2021-05-04T01:43:50.053 回答