当我使用文件路径在add()
对象上调用tarfile
时,该文件将添加到与目录层次结构关联的tarball中。换句话说,如果我解压缩tarfile,则会重现原始目录层次结构中的目录。
有没有办法简单地添加一个没有目录信息的普通文件来解压缩生成的tarball会产生一个扁平的文件列表?
答案 0 :(得分:58)
TarFile.add()方法的 arch 参数是匹配目标的另一种便捷方式。
示例:您希望将目录 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()
答案 1 :(得分:40)
您可以在tarfile.addfile()
对象中使用TarInfo
,这是第一个参数,您可以指定与您要添加的文件不同的name
。
这段代码应该将/path/to/filename
添加到TAR文件中,但会将其提取为myfilename
:
tar.addfile(tarfile.TarInfo("myfilename.txt"), open("/path/to/filename.txt"))
答案 2 :(得分:6)
也许您可以将“arcname”参数用于TarFile.add(name,arcname)。它需要文件在存档中的备用名称。
答案 3 :(得分:2)
感谢@diabloneo,创建一个dir的选择性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"])
答案 4 :(得分:-1)
如果您想在 tarfile 中添加目录名称而不是其内容,您可以执行以下操作:
(1) 创建一个名为 empty
的空目录
(2) tf.add("empty", arcname=path_you_want_to_add)
这会创建一个名为 path_you_want_to_add
的空目录。