Различать файлы с разных дисков в 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 ответа:
Вам нужно будет использовать
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)