140

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

4

8 に答える 8

245

ディレクトリツリー全体の.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ます。

于 2013-06-13T06:58:45.260 に答える
101
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」に置き換えてください。

于 2010-01-09T05:17:44.973 に答える
32

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

nameファイル名(の引数open)をで終わらせたいと思うかもしれ.tar.gzませんが、それは圧縮能力には影響しません。

ところで、通常はのモードでより良い圧縮が得られます。これは、通常の場合よりもさらによく圧縮できるの'w:bz2'と同じです。tarbzip2gzip

于 2010-01-09T05:19:07.197 に答える
20

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

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

subprocess.call(['tar', '-czf', output_filename, file_to_archive])
于 2019-07-19T11:55:09.790 に答える
3

@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()}")       
于 2020-03-15T22:42:48.697 に答える
0

この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ファイル圧縮での使用

于 2019-09-08T17:42:34.397 に答える
0

@ 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))
于 2021-05-04T01:43:50.053 に答える
0

完璧な答え

最高のパフォーマンスと圧縮ファイルなし...

subprocess.call(f'tar -cvzf {output_filename} *', cwd=source_dir, shell=True)

引数は、cwd圧縮する前にディレクトリを変更します。これにより、ドットの問題が解決されます。

ワイルドカードのshell=True使用を許可します(*

ディレクトリに対しても再帰的に動作します

于 2021-08-25T14:05:40.777 に答える