如何使用 Python 创建完整的压缩 tar 文件?

Posted

技术标签:

【中文标题】如何使用 Python 创建完整的压缩 tar 文件?【英文标题】:How to create full compressed tar file using Python? 【发布时间】:2011-01-03 04:41:03 【问题描述】:

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

【问题讨论】:

tar 不压缩数据,它只是将文件打包在一起。实际压缩的是 gzip。 【参考方案1】:

在这 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 文件中的使用 压缩在目录中

【讨论】:

导入tarfile包【参考方案2】:

完美答案

在压缩文件中没有... 的最佳性能!

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

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

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

也适用于递归目录

【讨论】:

【参考方案3】:

对@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))

【讨论】:

您应该考虑扩展此答案以包含有关其他答案有什么问题的详细信息,并解释此 sn-p 工作的原因。【参考方案4】:

除了@Aleksandr Tukallo 的回答,您还可以获得输出和错误消息(如果发生)。 following answer 上很好地解释了使用 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()")       

【讨论】:

【参考方案5】:

为整个目录树构建.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 相同。

【讨论】:

就像给读者的一个提示,如果你省略了arcname=os.path.basename(source_dir),那么它将在tar 文件中为你提供source_dir 的整个路径结构(在大多数情况下,这可能很不方便)。 第二个注释;使用arcname=os.path.basename(source_dir) 仍然意味着存档包含一个包含source_dir 内容的文件夹。如果您希望存档的根目录包含内容本身,而不是文件夹中的内容,请改用arcname=os.path.sep @Sheljohn 不幸的是,这并不完全正确,因为如果使用os.path.sep,那么存档将包含服务“。”或“/”文件夹,这通常不是问题,但如果您以后以编程方式处理此存档,有时可能会成为问题。似乎唯一真正干净的方法是做os.walk 并单独添加文件 要摆脱所有目录结构,只需使用arcname='.'。无需使用os.walk 如果我在 Linux 上生成这个 tar 文件,它会在 Windows 和 Mac 等其他平台上成功打开吗?【参考方案6】:

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

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

subprocess.call(['tar', '-czf', output_filename, file_to_archive])

【讨论】:

【参考方案7】:
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”即可。

【讨论】:

你真的应该在 Python 中使用with tarfile.open( ..,而不是手动调用openclose。打开常规文件时也是如此。 @CNBorn 我只想压缩到 sample.gz。 import tarfile tar = tarfile.open("sample.gz", "r:gz") for name in ["file1", "file2", "file3"]: tar.add(name) tar.close() 没关系?【参考方案8】:

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

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

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

【讨论】:

请注意,bzip2 压缩的 tarball 的文件名应以“.tar.bz2”结尾。

以上是关于如何使用 Python 创建完整的压缩 tar 文件?的主要内容,如果未能解决你的问题,请参考以下文章

Linux下如何在不解压jar包查看或修改配置文

tar---打包,解压缩linux的文件和目录

如何使用 python 读取压缩文件夹文件?

如何创建Tar Gz文件

linux文将于目录的压缩和解压缩命令:gzip压缩文件

python压缩成tar