Pythonの tarfile モジュールを使用して、複数のファイルやディレクトリをまとめてtarアーカイブを作成する方法を解説します。
単なるアーカイブ(無圧縮)だけでなく、gzipなどの圧縮アルゴリズムを併用してファイルサイズを小さくすることも可能です。
目次
open関数の書き込みモード一覧
tarfile.open() でアーカイブを新規作成(上書き)する際に指定するモードは以下の通りです。
拡張子に合わせて適切な圧縮モードを選択します。
| モード文字列 | 意味・用途 |
'w' | 無圧縮でtarファイルを作成します(拡張子 .tar)。 |
'w:gz' | gzip 圧縮を行います(拡張子 .tar.gz, .tgz)。最も一般的です。 |
'w:bz2' | bzip2 圧縮を行います(拡張子 .tar.bz2)。gzipより圧縮率が高い傾向があります。 |
'w:xz' | lzma (xz) 圧縮を行います(拡張子 .tar.xz)。圧縮率は非常に高いですが処理に時間がかかります。 |
実装例:ソースコードのバックアップ作成
ここでは、開発プロジェクトのソースコードディレクトリ(src/)と、ReadMeファイル(README.md)をまとめて、backup_v1.0.tar.gz という圧縮アーカイブを作成する処理を実装します。
ソースコード
import tarfile
# 作成するアーカイブファイル名
archive_name = "backup_v1.0.tar.gz"
# アーカイブに追加したいファイルやディレクトリ
targets = ["src", "README.md"]
print(f"--- アーカイブ '{archive_name}' を作成中 ---")
# 1. 書き込みモード('w:gz')で開く
with tarfile.open(archive_name, "w:gz") as tar:
for item in targets:
# 2. add(パス, arcname=別名) で追加
# ディレクトリを指定すると、再帰的に中身もすべて追加されます
# arcnameを指定しない場合、パスがそのままアーカイブ内の構造になります
try:
tar.add(item)
print(f"追加: {item}")
except FileNotFoundError:
print(f"警告: '{item}' が見つかりません。")
print("バックアップが完了しました。")
解説
tar.add(name, arcname=None)
ファイルまたはディレクトリをアーカイブに追加します。
- ディレクトリの処理: デフォルトで再帰的(recursive)に処理されるため、フォルダ名を指定するだけで中のファイルもすべてアーカイブされます(
recursive=Falseで無効化可能)。 - arcname (Archive Name): ZIPの時と同様、アーカイブ内での名前を変更したい場合に使用します。例えば
tar.add("C:/Users/Data", arcname="Data")とすると、フルパスではなくDataディレクトリとして格納されます。
追記モードについて
ZIPファイルとは異なり、圧縮されたtarファイル(.tar.gz など)への追記(’a’ モード)はできません。
一度解凍してから再作成するか、無圧縮の .tar 形式であれば追記が可能です。
