回答:
ディレクトリツリー全体の.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
ます。
arcname=os.path.basename(source_dir)
パス構造全体が表示さsource_dir
れます(ほとんどの場合、これはおそらく不便です)。
arcname=os.path.basename(source_dir)
still を使用すると、アーカイブにはのコンテンツを含むフォルダが含まれますsource_dir
。アーカイブのルートに、フォルダー内のコンテンツではなくコンテンツ自体を含める場合は、arcname=os.path.sep
代わりに使用します。
os.path.sep
、アーカイブにはサービス「。」が含まれるからです。または「/」フォルダ。通常は問題ありませんが、後でこのアーカイブをプログラムで処理する場合に問題になることがあります。それが唯一の本当のきれいな方法はos.walk
ファイルを個別に実行して追加することです
arcname='.'
。使用する必要はありませんos.walk
。
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」に置き換えます。
with tarfile.open( ..
代わりに呼び出すのでは、Pythonでopen
かつclose
手動。これは、通常のファイルを開く場合にも当てはまります。
tarfile.openをmode='w:gz'
で呼び出します。これは、「gzip圧縮書き込み用に開く」を意味します。
ファイル名(へのname
引数open
)を.tar.gz
で終了することもできますが、これは圧縮機能には影響しません。
ところで、あなたは、通常のモードで、より良い圧縮を得る'w:bz2'
ちょうど同じように、tar
通常より良いと圧縮できbzip2
、それはで圧縮することができますよりgzip
。
以前の回答では、tarfile
Pythonで.tar.gz
ファイルを作成するためにPythonモジュールを使用することが推奨されていました。これは明らかにPythonスタイルの優れたソリューションですが、アーカイブの速度に重大な欠点があります。この質問は、Linux tarfile
のtar
ユーティリティよりも約2倍遅いことを述べています。私の経験によれば、この見積もりはかなり正しいです。
したがって、アーカイブを高速化するには、モジュールを使用してtar
コマンドを使用できsubprocess
ます。
subprocess.call(['tar', '-czf', output_filename, file_to_archive])
@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()}")