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

如何使用Python创建完整的压缩tar文件?,python,compression,zip,tarfile,Python,Compression,Zip,Tarfile,如何在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'调用,意思是“打开以进行gzip压

如何在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'
调用,意思是“打开以进行gzip压缩写入”

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


顺便说一句,使用
'w:bz2'
模式通常可以获得更好的压缩效果,就像
tar
使用
bzip2
压缩效果通常比使用
gzip
压缩效果更好,从而为整个目录树构建
.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))

这将创建一个gzip tar存档,其中包含一个顶级文件夹,其名称和内容与
source\u dir

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

因此,为了更快地存档,您可以使用
子流程
模块使用
tar
命令:

subprocess.call(['tar', '-czf', output_filename, file_to_archive])
在这个 tar.gz文件在open view目录中压缩 在solve中使用os.path.basename(文件\目录)


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

除了@Aleksandr Tukallo的答案之外,您还可以获得输出和错误消息(如果发生)。使用
tar
压缩文件夹在上有很好的解释


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

tar不压缩数据,它只是将文件打包在一起。实际的压缩是由gzip完成的。请注意,bzip2压缩tarballs的文件名应以“.tar.bz2”结尾。请注意,如果您省略
arcname=os.path.basename(source_dir)
,那么它将在tar文件中为您提供
source_dir
的整个路径结构(在大多数情况下,这可能不方便)。第二个注意事项:使用
arcname=os.path.basename(source\u dir)
仍然意味着存档包含一个文件夹,其中包含
源目录的内容。
如果希望存档的根目录包含内容本身,而不是文件夹中的内容,请使用
arcname=os.path.sep
。@Sheljohn不幸的是,这并不完全正确,因为如果使用
os.path.sep
,则存档将包含服务“.”或“/”文件夹通常不是问题,但如果以后以编程方式处理此归档文件,有时可能会出现问题。似乎唯一真正干净的方法是执行
os.walk
并单独添加文件。要摆脱所有目录结构,只需使用
arcname='。
。无需使用
os.walk
。您应该真正使用
使用tarfile.open(..
在Python中,而不是手动调用
open
close
。打开常规文件时也是如此。@CNBorn我只想压缩到sample.gz.import tarfile tar=tarfile.open(“sample.gz”,“r:gz”)作为[“file1”,“file2”,“file3”]:tar.add(name)tar.close()中的名称可以吗?导入TARFILE包装,你应该考虑扩展这个答案来包括关于其他答案的错误的细节,并解释为什么这个片段会起作用。
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()}")       
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))