Как файлы могут быть добавлены в tarfile с помощью Python без добавления иерархии каталогов?
Когда я вызываю add()
объекта tarfile
с файловым путем, файл добавляется в архив с привязанностью к каталогу. Другими словами, если я разархивирую tarfile, будут воспроизведены каталоги в исходной иерархии каталогов.
Есть ли способ просто добавить простой файл без информации о директории, чтобы разграничить полученный tarball с плоским списком файлов?
Ответы
Ответ 1
Вы можете использовать tarfile.addfile()
, в объекте TarInfo
, который является первым параметром, вы можете указать name
, который отличается от файла, который вы добавляете.
Этот фрагмент кода должен добавить /path/to/filename
в файл TAR, но извлечет его как myfilename
:
tar.addfile(tarfile.TarInfo("myfilename.txt"), open("/path/to/filename.txt"))
Ответ 2
Использование аргумента arcname метода TarFile.add() является альтернативным и удобным способом для сопоставления с пунктом назначения.
Пример: вы хотите заархивировать каталог dir 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()
Ответ 3
Возможно, вы можете использовать аргумент "arcname" для TarFile.add(name, arcname). Требуется альтернативное имя, которое файл будет иметь внутри архива.
Ответ 4
благодаря @diabloneo, функция для создания выборочного тарбола режиссера
def 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"])