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


Answers:


186

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

这将创建一个压缩的tar归档文件,其中包含一个名称和内容与相同的单个顶级文件夹source_dir


31
就像给读者的注释一样,如果您忽略了arcname=os.path.basename(source_dir)它,它将为您提供source_dirtar文件中的整个路径结构(在大多数情况下,这可能很不方便)。
Brōtsyorfuzthrāx

12
第二个音符;使用arcname=os.path.basename(source_dir)still表示存档包含一个文件夹,其中包含的内容source_dir。如果希望归档文件的根目录本身包含内容,而不是文件夹中的内容,请arcname=os.path.sep改用。
乔纳森·H

2
不幸的是,@ Sheljohn并不完全正确,因为如果使用os.path.sep,则存档将包含服务“”。或“ /”文件夹,通常这不是问题,但是有时如果以后通过编程方式处理此存档,可能会成为问题。似乎唯一真正的干净方法是os.walk单独进行添加文件
The Godfather

要摆脱所有目录结构,只需使用arcname='.'。无需使用os.walk
edouardtheron

85
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”。


10
你真的应该使用with tarfile.open( ..在Python,而不是调用openclose手动。打开常规文件时也是如此。
乔纳森·H

31

你叫tarfile.openmode='w:gz',意为“开放的gzip压缩的写作。”

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

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


6
请注意,bzip2压缩的tarball的文件名应以“ .tar.bz2”结尾。
伊格纳西奥·巴斯克斯

8

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

因此,为了加快归档速度,可以使用tarusing subprocess模块命令:

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

0

在此tar.gz文件中,在打开的视图目录中压缩要解决,请使用os.path.basename(file_directory)

with tarfile.open("save.tar.gz","w:gz"):
      for file in ["a.txt","b.log","c.png"]:
           tar.add(os.path.basename(file))

它在tar.gz文件中的使用压缩在目录中


0

除了@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()}")       
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.