当前位置: 代码迷 >> python >> 如何在不添加目录层次结构的情况下使用 Python 将文件添加到 tarfile?
  详细解决方案

如何在不添加目录层次结构的情况下使用 Python 将文件添加到 tarfile?

热度:108   发布时间:2023-07-16 09:38:10.0

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

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

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

示例:您想将目录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()

您可以使用 ,在对象中,这是第一个参数,您可以指定一个与您正在添加的文件不同的name

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

tar.addfile(tarfile.TarInfo("myfilename.txt"), open("/path/to/filename.txt"))

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

感谢@diabloneo,功能创建目录的选择性tarball

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"])

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

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

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