72

当我add()tarfile具有文件路径的对象上调用时,该文件将添加到具有关联目录层次结构的 tarball 中。换句话说,如果我解压缩 tar 文件,原始目录层次结构中的目录就会被复制。

有没有办法简单地添加一个没有目录信息的普通文件,解压缩生成的压缩包会产生一个平面文件列表?

4

5 回答 5

96

使用 TarFile.add() 方法的arcname参数是匹配目标的另一种方便的方法。

示例:您想将 dir repo/a.git/存档到tar.gz文件,但您希望存档中的树根以a.git/开头而不是repo/a.git/,您可以这样做以下内容:

archive = tarfile.open("a.git.tar.gz", "w|gz")
archive.add("repo/a.git", arcname="a.git")
archive.close()
于 2012-06-09T17:06:56.777 回答
58

您可以tarfile.addfile()TarInfo对象中使用 , 这是第一个参数,您可以指定name与您正在添加的文件不同的 a。

这段代码应该添加/path/to/filename到 TAR 文件中,但会将其提取为myfilename

tar.addfile(tarfile.TarInfo("myfilename.txt"), open("/path/to/filename.txt"))
于 2010-02-10T19:25:02.387 回答
6

也许您可以使用 TarFile.add(name, arcname) 的“arcname”参数。它采用文件在存档中的备用名称。

于 2010-06-07T22:56:29.523 回答
3

感谢@diabloneo,用于创建目录的选择性压缩包

def compress(output_file="archive.tar.gz", output_dir='', root_dir='.', items=[]):
    """compress dirs.

    KWArgs
    ------
    output_file : str, default ="archive.tar.gz"
    output_dir : str, default = ''
        absolute path to output
    root_dir='.',
        absolute path to input root dir
    items : list
        list of dirs/items relative to root dir

    """
    os.chdir(root_dir)
    with tarfile.open(os.path.join(output_dir, output_file), "w:gz") as tar:
        for item in items:
            tar.add(item, arcname=item)    


>>>root_dir = "/abs/pth/to/dir/"
>>>compress(output_file="archive.tar.gz", output_dir=root_dir, 
            root_dir=root_dir, items=["logs", "output"])
于 2018-06-13T16:29:34.443 回答
-2

如果要在 tarfile 中添加目录名称而不是其内容,可以执行以下操作:

empty (1) 创建一个名为(2)的空目录tf.add("empty", arcname=path_you_want_to_add)

这将创建一个名为 的空目录path_you_want_to_add

于 2021-02-27T04:03:51.627 回答