【Python】tar形式でファイルを圧縮・アーカイブする:tarfileの書き込み

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 形式であれば追記が可能です。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次