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

sha*_*pan 89 python compression zip tarfile

如何在Python中使用压缩创建.tar.gz文件?

Geo*_*lly 156

要为整个目录树构建.tar.gz(aka .tgz):

import tarfile

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))
Run Code Online (Sandbox Code Playgroud)

  • 正如读者注意的那样,如果省略`arcname = os.path.basename(source_dir)`那么它将在tar文件中为你提供`source_dir`的完整路径结构(在大多数情况下,这可能不方便) . (26认同)
  • 第二个说明; 使用`arcname = os.path.basename(source_dir)`仍然意味着存档包含一个包含`source_dir`内容的文件夹.如果希望存档的根目录包含内容本身,而不是文件夹中的内容,请改用"arcname = os.path.sep". (11认同)
  • 要摆脱所有目录结构,只需使用 `arcname='.'`。无需使用“os.walk”。 (4认同)
  • @Sheljohn不幸的是,这不是完全正确的,因为如果使用`os.path.sep`,则归档文件将包含服务“”。或“ /”文件夹,通常这不是问题,但是有时如果以后通过编程方式处理此存档,可能会成为问题。似乎唯一真正的干净方法是执行“ os.walk”并分别添加文件 (2认同)

CNB*_*orn 84

import tarfile
tar = tarfile.open("sample.tar.gz", "w:gz")
for name in ["file1", "file2", "file3"]:
    tar.add(name)
tar.close()
Run Code Online (Sandbox Code Playgroud)

如果要创建tar.bz2压缩文件,只需将文件扩展名替换为".tar.bz2",将"w:gz"替换为"w:bz2".

  • 你应该在Python中使用`with tarfile.open(..`,而不是手动调用`open`和`close`.打开常规文件也是如此. (7认同)

Ale*_*lli 30

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

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

顺便说一句,你平时用的模式得到更好的压缩'w:bz2',就像tar平时甚至可以更好地压缩bzip2比它可以压缩gzip.

  • 请注意,bzip2压缩的tarball的文件名应以".tar.bz2"结尾. (6认同)

小智 7

Shutil.make_archive对于文件和目录都非常方便(内容递归添加到存档中):

import shutil

compressed_file = shutil.make_archive(
        base_name='archive',   # archive file name w/o extension
        format='gztar',        # available formats: zip, gztar, bztar, xztar, tar
        root_dir='path/to/dir' # directory to compress
)
Run Code Online (Sandbox Code Playgroud)


Ale*_*llo 5

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

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

subprocess.call(['tar', '-czf', output_filename, file_to_archive])
Run Code Online (Sandbox Code Playgroud)