python tarfile 无需完整路径

6 投票
2 回答
4662 浏览
提问于 2025-04-16 10:19

我写了一个小脚本,下面是代码,它可以读取一组文件并把它们打包成一个压缩文件。现在一切都运行得很好,唯一的问题是,当我解压这个压缩文件时,里面的文件路径是完整的,包括文件所在的文件夹结构。我想知道有没有办法在打包时不保留这些文件夹的结构呢?

compressor = tarfile.open(PATH_TO_ARCHIVE + re.sub('[\s.:"-]+', '', 
    str(datetime.datetime.now())) + '.tar.gz', 'w:gz')

for file in os.listdir(os.path.join(settings.MEDIA_ROOT, PATH_CSS_DB_OUT)):
    compressor.add(os.path.join(settings.MEDIA_ROOT, PATH_CSS_DB_OUT) + file)

compressor.close()

2 个回答

2

我写了一个上下文管理器,用来改变当前的工作目录,这样可以方便地处理tar文件。

import contextlib
@contextlib.contextmanager
def cd_change(tmp_location):
    cd = os.getcwd()
    os.chdir(tmp_location)
    try:
        yield
    finally:
        os.chdir(cd)

然后,针对你的情况,把所有东西打包起来:

with cd_change(os.path.join(settings.MEDIA_ROOT, PATH_CSS_DB_OUT)):
    for file in os.listdir('.'):
        compressor.add(file)
8

看看这个 TarFile.add 的用法说明:

... 如果提供了 arcname,那么它就会指定一个在压缩文件中使用的替代文件名。

撰写回答