Answers:
为整个目录树构建一个.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
。
arcname=os.path.basename(source_dir)
它,它将为您提供source_dir
tar文件中的整个路径结构(在大多数情况下,这可能很不方便)。
arcname=os.path.basename(source_dir)
still表示存档包含一个文件夹,其中包含的内容source_dir
。如果希望归档文件的根目录本身包含内容,而不是文件夹中的内容,请arcname=os.path.sep
改用。
os.path.sep
,则存档将包含服务“”。或“ /”文件夹,通常这不是问题,但是有时如果以后通过编程方式处理此存档,可能会成为问题。似乎唯一真正的干净方法是os.walk
单独进行添加文件
arcname='.'
。无需使用os.walk
。
你叫tarfile.open与mode='w:gz'
,意为“开放的gzip压缩的写作。”
您可能希望以结束文件名(的name
参数open
).tar.gz
,但这不会影响压缩功能。
顺便说一句,通常您可以使用的方式获得更好的压缩效果'w:bz2'
,就像tar
通常使用bzip2
时可以压缩甚至比使用时可以压缩得更好gzip
。
先前的答案建议使用tarfile
Python模块.tar.gz
在Python中创建文件。这显然是一个不错的Python风格的解决方案,但是它在归档速度方面存在严重缺陷。这个问题提到的tarfile
速度大约是tar
Linux中实用程序。根据我的经验,这一估计是非常正确的。
因此,为了加快归档速度,可以使用tar
using subprocess
模块命令:
subprocess.call(['tar', '-czf', output_filename, file_to_archive])
除了@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()}")