2

我正在尝试使用该tarfile库归档和压缩分布在多个驱动器上的多个目录。问题是tarfile即使两个文件存储在不同的驱动器中也会合并路径。例如:

import tarfile
with tarfile.open(r"D:\Temp\archive.tar.gz", "w:gz") as tf:
    tf.add(r"C:\files\foo")
    tf.add(r"D:\files\bar")

将创建一个包含以下文件的存档:

archive.tar.gz
└─ files
   ├─ foo
   └─ bar

有没有办法创造这个?

archive.tar.gz
├─ C
|  └─ files
|     └─ foo
└─ D
   └─ files
      └─ bar
4

2 回答 2

4

您需要使用tarfile.addfile()而不是tarfile.add()

使用 TarInfo,您可以指定将在存档中使用的文件名。

例子:

with open(r"C:\files\foo", "rb") as ff:
    ti = tf.gettarinfo(arcname="C/files/foo", fileobj=ff)
    tf.addfile(ti, ff)

或者,一个更快的解决方案:

tf.add('/path/to/dir/to/add/', arcname='C/files')
tf.add('/path/to/otherdir/to/add/', arcname='D/files')
于 2016-09-01T19:09:44.557 回答
0

感谢Loïc的回答,它帮助我找到了我正在寻找的实际答案。(也让我浪费了大约一个小时,因为我对你在答案中混淆的 linux 和 windows 风格的路径感到非常困惑)......

import os
import tarfile

def create_archive(paths, arc_paths, archive_path):
    with tarfile.open(archive_path, "w:gz") as tf:
        for path, arc_path in zip(paths, arc_paths):
            tf.add(path, arcname=arc_path)

def main():
    archive = r"D:\Temp\archive.tar.gz"
    paths = [r"C:\files\foo", r"D:\files\bar"]
    # Making sure all the paths are absolute.
    paths = [os.path.abspath(path) for path in paths]
    # Creating arc-style paths
    arc_paths = [path.replace(':', '') for path in paths]
    # Create the archive including drive letters (if in windows)
    create_archive(paths, arc_paths, archive)
于 2016-09-02T10:46:04.500 回答