Различать файлы с разных дисков в tarfile


Я пытаюсь архивировать и сжимать несколько каталогов, разбросанных по нескольким дискам, используя библиотеку tarfile. Проблема в том, что tarfile объединяет пути, даже если два файла хранятся на разных дисках. Например:

import tarfile
with tarfile.open(r"D:Temparchive.tar.gz", "w:gz") as tf:
    tf.add(r"C:filesfoo")
    tf.add(r"D:filesbar")

Создаст архив, содержащий следующие файлы:

archive.tar.gz
└─ files
   ├─ foo
   └─ bar
Есть ли способ создать это?
archive.tar.gz
├─ C
|  └─ files
|     └─ foo
└─ D
   └─ files
      └─ bar
2 2

2 ответа:

Вам нужно будет использовать 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')

СпасибоЛоик за ваш ответ, он помог мне найти реальный ответ, который я искал. (А также заставил меня потратить около часа, потому что я действительно запутался с путями стилей 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)