web-dev-qa-db-ja.com

ディレクトリ階層を追加せずに、Pythonでtarfileにファイルを追加するにはどうすればよいですか?

ファイルパスを持つtarfileオブジェクトでadd()を呼び出すと、ファイルはディレクトリ階層が関連付けられてtarballに追加されます。つまり、tarfileを解凍すると、元のディレクトリ階層のディレクトリが再現されます。

ディレクトリ情報なしでプレーンファイルを追加するだけで、結果のtarballを展開するとファイルのフラットリストが生成される方法はありますか?

52
theactiveactor

tarfile.addfile() を使用できます。最初のパラメーターである TarInfo オブジェクトでは、追加するファイルとは異なるnameを指定できます。

このコードは、/path/to/filenameをTARファイルに追加する必要がありますが、myfilenameとして抽出します。

tar.addfile(tarfile.TarInfo("myfilename.txt"), open("/path/to/filename.txt"))
43
Wim

TarFile.add()メソッドのArch引数は、宛先を一致させる代替の便利な方法です。

例:dirrepo/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()
63
diabloneo

たぶん、TarFile.add(name、arcname)に「arcname」引数を使用できます。ファイルがアーカイブ内に持つ代替名を取ります。

6
Lauro Moura

@diabloneoのおかげで、dirの選択的tarballを作成する機能

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"])
2
muon