Pythonで圧縮した.tar.gzファイルを作成するにはどうすればよいですか?
8 に答える
ディレクトリツリー全体の.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ます。
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」に置き換えてください。
tarfile.openをmode='w:gz'、「gzip圧縮書き込み用に開く」を意味するで呼び出します。
nameファイル名(の引数open)をで終わらせたいと思うかもしれ.tar.gzませんが、それは圧縮能力には影響しません。
ところで、通常はのモードでより良い圧縮が得られます。これは、通常の場合よりもさらによく圧縮できるの'w:bz2'と同じです。tarbzip2gzip
以前の回答では、Pythonでファイルtarfileを作成するためにPythonモジュールを使用することをお勧めします。.tar.gzこれは明らかに優れたPythonスタイルのソリューションですが、アーカイブの速度に重大な欠点があります。この質問は、Linuxのユーティリティtarfileよりも約2倍遅いと述べています。tar私の経験によると、この見積もりはかなり正しいです。
したがって、アーカイブを高速化するには、モジュールを使用して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()}")
このtar.gzファイルでは、開いているビューディレクトリで圧縮します。解決するには、os.path.basename(file_directory)を使用します。
import tarfile
with tarfile.open("save.tar.gz","w:gz") as tar:
for file in ["a.txt","b.log","c.png"]:
tar.add(os.path.basename(file))
ディレクトリ内のtar.gzファイル圧縮での使用
@ THAVASI.Tの回答に対するマイナーな修正。これは、「tarfile」ライブラリのインポートの表示を省略し、3行目で使用される「tar」オブジェクトを定義していません。
import tarfile
with tarfile.open("save.tar.gz","w:gz") as tar:
for file in ["a.txt","b.log","c.png"]:
tar.add(os.path.basename(file))
完璧な答え
最高のパフォーマンスと圧縮ファイルなし.で..!
subprocess.call(f'tar -cvzf {output_filename} *', cwd=source_dir, shell=True)
引数は、cwd圧縮する前にディレクトリを変更します。これにより、ドットの問題が解決されます。
ワイルドカードのshell=True使用を許可します(*)
ディレクトリに対しても再帰的に動作します