当我在一个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()
arcname ="a.git"
将在归档文件中创建一个名为 a.git
的文件夹。您可以使用 arcname =""
在不创建文件夹的情况下将文件归档到 repo/a.git
目录中。 - Comrade Che您可以使用tarfile.addfile()
,在TarInfo
对象中,第一个参数中指定一个与添加的文件不同的name
。
这段代码应该将/path/to/filename
添加到TAR文件中,但将其提取为myfilename
:
tar.addfile(tarfile.TarInfo("myfilename.txt"), open("/path/to/filename.txt"))
tar.add()
方法同样适用!若要添加整个目录树,并使用不同的名称,只需执行:tar.add('/path/to/dir/to/add/', arcname='newdirname')
,然后tar文件将包含一个名为“newdirname”的目录,其中包含所有内容都未经修改。 - Armando Pérez Marquésarcname='.'
。 - Giacomo Tagliabuefile()
只适用于 Python 2,open()
是等效的,并且在 Python 2 和 3 中都可以使用。我编辑了我的答案以使用 open
。 - Wimarcname='.'
时,我尝试解压和提取内容时遇到了 IsADirectoryError
。不过,使用下面 @diabloneo 的答案就可以了。 - rerdef 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"])
以下是示例代码,用于在不添加文件夹的情况下压缩文件夹
中的文件列表:
with tarfile.open(tar_path, 'w') as tar:
for filename in os.listdir(folder):
fpath = os.path.join(folder, filename)
tar.add(fpath, arcname=filename)
empty
的空目录
(2) tf.add("empty", arcname=path_you_want_to_add)
这将创建一个名为path_you_want_to_add
的空目录。
shutil.make_archive()
函数,特别是root_dir
和base_dir
参数。请参考文档中的示例和例如这个。 - undefined