当我add()
在tarfile
具有文件路径的对象上调用时,该文件将添加到具有关联目录层次结构的 tarball 中。换句话说,如果我解压缩 tar 文件,原始目录层次结构中的目录就会被复制。
有没有办法简单地添加一个没有目录信息的普通文件,解压缩生成的压缩包会产生一个平面文件列表?
使用 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()
您可以tarfile.addfile()
在TarInfo
对象中使用 , 这是第一个参数,您可以指定name
与您正在添加的文件不同的 a。
这段代码应该添加/path/to/filename
到 TAR 文件中,但会将其提取为myfilename
:
tar.addfile(tarfile.TarInfo("myfilename.txt"), open("/path/to/filename.txt"))
也许您可以使用 TarFile.add(name, arcname) 的“arcname”参数。它采用文件在存档中的备用名称。
感谢@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"])
如果要在 tarfile 中添加目录名称而不是其内容,可以执行以下操作:
empty
(1) 创建一个名为(2)的空目录tf.add("empty", arcname=path_you_want_to_add)
这将创建一个名为 的空目录path_you_want_to_add
。