目次
		  
		  
		  
		
Pythonでtar.gzアーカイブを扱う方法
 備忘録&自分用のおさらいスニペットとしてエントリをアップします。
 このエントリでは、Python の tarfile モジュールを使って、tar.gz アーカイブファイルを読んだり、書き込んだり(=出力)するサンプルを掲載します。
Python の tarfile モジュール
公式サイトはこちらです(Python3.6用です)
			
tarfile モジュールのインポート
インポート処理のコードは以下の通りです。シンプルに一行です。
import tarfiletar.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)
- メモリ上のデータ(テキスト等)をバイナリ形式に変換して、渡す必要がある。
- io.BytesIO型を使うと便利。 公式リファレンス
 
- 書き込むファイルごとに TarInfoインスタンスを用意する。- TarInfo.sizeを忘れずにセットすること。セットしないとデータが書き込まれず、アーカイブ内で 0 Bytes となってしまう。
 
- 書き込むファイルの TarInfoインスタンスと、書き込むデータ(io.BytesIo型)が準備できたら、Tarfile.addfile()を使って書き込む。- addfile()のリファレンスはこちら
 
まとめ等
エントリがそろってきたら、索引ページを準備しようと思います。
