目次
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)
- メモリ上のデータ(テキスト等)をバイナリ形式に変換して、渡す必要がある。
io.BytesIO
型を使うと便利。 公式リファレンス
- 書き込むファイルごとに
TarInfo
インスタンスを用意する。TarInfo.size
を忘れずにセットすること。セットしないとデータが書き込まれず、アーカイブ内で 0 Bytes となってしまう。
- 書き込むファイルの
TarInfo
インスタンスと、書き込むデータ(io.BytesIo
型)が準備できたら、Tarfile.addfile()
を使って書き込む。addfile()
のリファレンスはこちら
まとめ等
エントリがそろってきたら、索引ページを準備しようと思います。