Pythonを使用して完全に圧縮されたtarファイルを作成する方法


107

Pythonで圧縮された.tar.gzファイルを作成するにはどうすればよいですか?


16
tarはデータを圧縮せず、ファイルをまとめるだけです。実際の圧縮を行うのはgzipです。
Ignacio Vazquez-Abrams

回答:


186

ディレクトリツリー全体の.tar.gz(別名.tgz)を構築するには:

import tarfile
import os.path

def make_tarfile(output_filename, source_dir):
    with tarfile.open(output_filename, "w:gz") as tar:
        tar.add(source_dir, arcname=os.path.basename(source_dir))

これにより、と同じ名前と内容の単一の最上位フォルダを含むgzip圧縮されたtarアーカイブが作成されsource_dirます。


31
読者へのメモと同じように、省略した場合は、tarファイル内のarcname=os.path.basename(source_dir)パス構造全体が表示さsource_dirれます(ほとんどの場合、これはおそらく不便です)。
Brōtsyorfuzthrāx

12
2番目のメモ。arcname=os.path.basename(source_dir)still を使用すると、アーカイブにはのコンテンツを含むフォルダが含まれますsource_dir。アーカイブのルートに、フォルダー内のコンテンツではなくコンテンツ自体を含める場合は、arcname=os.path.sep代わりに使用します。
Jonathan H

2
@Sheljohn残念ながら、これは完全には正しくありません。なぜなら、を使用した場合os.path.sep、アーカイブにはサービス「。」が含まれるからです。または「/」フォルダ。通常は問題ありませんが、後でこのアーカイブをプログラムで処理する場合に問題になることがあります。それが唯一の本当のきれいな方法はos.walkファイルを個別に実行して追加することです
ゴッドファーザー

すべてのディレクトリ構造を削除するには、単にを使用しますarcname='.'。使用する必要はありませんos.walk
edouardtheron

85
import tarfile
tar = tarfile.open("sample.tar.gz", "w:gz")
for name in ["file1", "file2", "file3"]:
    tar.add(name)
tar.close()

tar.bz2圧縮ファイルを作成する場合は、ファイル拡張子名を「.tar.bz2」に置き換え、「w:gz」を「w:bz2」に置き換えます。


10
あなたは本当に使用する必要がありますwith tarfile.open( ..代わりに呼び出すのでは、Pythonでopenかつclose手動。これは、通常のファイルを開く場合にも当てはまります。
Jonathan H

31

tarfile.openmode='w:gz'で呼び出します。これは、「gzip圧縮書き込み用に開く」を意味します。

ファイル名(へのname引数open)を.tar.gzで終了することもできますが、これは圧縮機能には影響しません。

ところで、あなたは、通常のモードで、より良い圧縮を得る'w:bz2'ちょうど同じように、tar通常より良いと圧縮できbzip2、それはで圧縮することができますよりgzip


6
bzip2で圧縮されたtarballのファイル名は「.tar.bz2」で終わる必要があることに注意してください。
Ignacio Vazquez-Abrams

8

以前の回答では、tarfilePythonで.tar.gzファイルを作成するためにPythonモジュールを使用することが推奨されていました。これは明らかにPythonスタイルの優れたソリューションですが、アーカイブの速度に重大な欠点があります。この質問は、Linux tarfiletarユーティリティよりも約2倍遅いことを述べています。私の経験によれば、この見積もりはかなり正しいです。

したがって、アーカイブを高速化するには、モジュールを使用してtarコマンドを使用できsubprocessます。

subprocess.call(['tar', '-czf', output_filename, file_to_archive])

0

このtar.gzファイルでは、開いているビューディレクトリで圧縮します。ソルブでは、os.path.basename(file_directory)を使用します。

with tarfile.open("save.tar.gz","w:gz"):
      for file in ["a.txt","b.log","c.png"]:
           tar.add(os.path.basename(file))

ディレクトリでのtar.gzファイル圧縮での使用


0

@Aleksandr Tukalloの回答に加えて、出力とエラーメッセージ(発生した場合)を取得することもできます。を使用したフォルダの圧縮はtar次の回答でかなりよく説明されています

import traceback
import subprocess

try:
    cmd = ['tar', 'czfj', output_filename, file_to_archive]
    output = subprocess.check_output(cmd).decode("utf-8").strip() 
    print(output)          
except Exception:       
    print(f"E: {traceback.format_exc()}")       
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.