Как можно добавить файлы в tar-файл с помощью Python, не добавляя иерархию каталогов? - PullRequest
51 голосов
/ 10 февраля 2010

Когда я вызываю add() для объекта tarfile с путем к файлу, файл добавляется в архив с ассоциированной иерархией каталогов. Другими словами, если я разархивирую tar-файл, будут воспроизведены каталоги в исходной иерархии каталогов.

Есть ли способ простого добавления простого файла без информации о каталоге, который, в отличие от полученного архива, дает плоский список файлов?

Ответы [ 4 ]

60 голосов
/ 09 июня 2012

Аргумент arch метода 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()
42 голосов
/ 10 февраля 2010

Вы можете использовать tarfile.addfile(), в объекте TarInfo, который является первым параметром, вы можете указать name, который отличается от файла, который вы добавление.

Этот фрагмент кода должен добавить /path/to/filename к файлу TAR, но извлечет его как myfilename:

tar.addfile(tarfile.TarInfo("myfilename.txt"), open("/path/to/filename.txt"))
6 голосов
/ 08 июня 2010

Возможно, вы можете использовать аргумент "arcname" для TarFile.add (name, arcname). Требуется альтернативное имя, которое файл будет иметь внутри архива.

2 голосов
/ 13 июня 2018

благодаря функции @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"])
...