注目キーワード

Pythonでtar.gzアーカイブファイルの読み書きをするときのサンプル

Pythonでtar.gzアーカイブを扱う方法

 備忘録&自分用のおさらいスニペットとしてエントリをアップします。
 このエントリでは、Python の tarfile モジュールを使って、tar.gz アーカイブファイルを読んだり、書き込んだり(=出力)するサンプルを掲載します。

Python の tarfile モジュール

公式サイトはこちらです(Python3.6用です)

tarfile モジュールのインポート

 インポート処理のコードは以下の通りです。シンプルに一行です。

import tarfile

tar.gz アーカイブを読み込む

 tar.gz アーカイブファイルをディスク上に展開するのではなく、メモリ上で処理する場合のコードです。

with tarfile.open('./sample.tar.gz', 'r') as tarf:
    # アーカイブに含まれるファイルの目録
    members = tarf.getmembers()
    for _member in members:
        # 各ファイル名を表示する
        print('Processing : {}'.format(_member.name))

        # アーカイブに含まれる各ファイルを開く
        _fp = tarf.extractfile(_member)

        # 各ファイルの内容を読み込む
        _body = _fp.read()

        # なんらかの処理
  • アーカイブファイルを開くには tarfile.open() を使用する
  • アーカイブに含まれるファイルの一覧は、tarfile インスタンスの getmembers() メソッドを使う。
    • TarInfo インスタンスのリストが返される。
    • TarInfo インスタンスは、アーカイブに含まれる各ファイルを表している。
  • TarInfo インスタンスのプロパティ name に、アーカイブ中のファイル名(相対パス形式)が入っている。

tar.gz アーカイブを出力するコード

 ディスク上にある一時ファイルをアーカイブに出力するのではなく、メモリ上にあるデータをアーカイブに出力する場合のコードです。

  # ファイルを1つだけアーカイブに出力する場合
  with tarfile.open('./output.tar.gz', 'w:gz') as tar:
      # バイナリ形式で書き込むデータを準備する
      _binary_obj = io.BytesIO(some_text_.encode(encoding='utf-8'))

      # TarInfo インスタンスを準備する
      _tarinfo = tarfile.TarInfo(name='output/some/text/some_text.txt')

      # データのサイズも忘れずに指定すること。これを忘れると0バイトになってしまう。
      _tarinfo.size = len(_binary_obj.getvalue())

      # アーカイブに書き込む
      tar.addfile(_tarinfo, fileobj=_binary_obj)
  • メモリ上のデータ(テキスト等)をバイナリ形式に変換して、渡す必要がある。
  • 書き込むファイルごとに TarInfo インスタンスを用意する。
    • TarInfo.size を忘れずにセットすること。セットしないとデータが書き込まれず、アーカイブ内で 0 Bytes となってしまう。
  • 書き込むファイルの TarInfo インスタンスと、書き込むデータ(io.BytesIo型)が準備できたら、Tarfile.addfile() を使って書き込む。
    • addfile() のリファレンスはこちら

まとめ等

 エントリがそろってきたら、索引ページを準備しようと思います。

最新情報をチェックしよう!