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