## 7.17.1 ファイルの圧縮（解凍）

圧縮ファイルの操作は `BZ2File` クラスで提供されています。

class `BZ2File`( | filename[, mode[, buffering[, compresslevel]]])

  bz2 ファイルを開きます。ファイルのモードは `'r'` または `'w'` で、それぞれ読み出しと書き込みに対応します。 書き出し用に開いた場合、ファイルが存在しないなら新しくファイルが 作成され、そうでない場合ファイルは切り詰められます。 buffering パラメタが与えられた場合、`0` はバッファリング を行わないことを表し、それよりも大きい値はバッファサイズの指定値 となります。デフォルトでは `0` です。compresslevel が与えられている場合、この値は `1` から `9` までの 整数値でなければなりません。デフォルトの値は `9` です。 ファイルへの入力に広範囲の改行文字バリエーションをサポートさせたい 場合は "`U`" をファイルモードに追加します。 入力ファイルの行末はどれも、Pythonからは "`\n`" として見えます。 また、また、開かれているファイルオブジェクトは `newlines` 属性 を持ち、`None` (まだ改行文字を読み込んでいない時), `'\r'`, `'\n'`, `'\r\n'` または全ての改行文字バリエーション を含むタプルになります。広範囲の改行文字サポートは読み込みだけで 利用可能です。生成されるインスタンスは通常のファイルインスタンスと 同様の反復操作をサポートします。

`close`( | )

  ファイルを閉じます。オブジェクトのデータ属性 `closed` を真に します。閉じられたファイルは以後の入出力操作に用いることができません。 `close()` 自体はエラーを引き起こすことなく何度も呼び出すことが できます。

`read`( | [size])

  最大で size バイトの解凍されたデータを読み出し、文字列として 返します。size 引数が負であるか省略された場合、EOF に たどり着くまで読み込みます。

`readline`( | [size])

  ファイルから次の 1 行を読み出し、改行文字も含めて文字列を返します。 負でない size 値は、返される文字列の最大バイト長を制限します (その場合不完全な行が返されることもあります) EOF の時には空文字列 が返されます。

`readlines`( | [size])

  ファイルから読み取った行文字列の集合からなるリストを返します。 オプション引数 size が与えられていれば、返される行文字列 全体のバイト数長さの大体の上限が指定されます。

`xreadlines`( | )

  前のバージョンとの互換性のために用意されています。 `BZ2File` オブジェクトはかつて `xreadlines` モジュールで提供されて いたパフォーマンス最適化を含んでいます。
  リリース 2.3 以降で撤廃された仕様です。 このメソッドは `file` オブジェクトの同名の メソッドとの互換性のために用意されていますが、現在は推奨されない メソッドです。代りに `for line in file` を使ってください。

`seek`( | offset[, whence])

  ファイル位置を移動します。 引数 offset はバイト数での値です。 オプション引数 whence はデフォルトで `0` (ファイルの 先頭からのオフセットであり、offset `>= 0` となるはず) に設定されて います。他の値は `1` (現在のファイル位置からの相対位置であり、 正負どちらの値もとり得ます)、および `2` (ファイルの終末端からの 相対位置であり、通常負の値になりますが、多くのプラットフォームで ファイルの終末端を越えて seek を行うことができます)。

  bz2 ファイルの seek はエミュレーションであり、パラメタの設定によっては 処理が非常に低速になるかもしれないので注意してください。

`tell`( | )

  現在のファイル位置を整数（long 整数になるかもしれません）で返します。

`write`( | data)

  ファイルに文字列 data を書き込みます。バッファリングのため、 ディスク上のファイルに書き込まれたデータを反映させるには `close()` が必要になるかもしれないので注意してください。

`writelines`( | sequence_of_strings)

  複数の文字列からなる配列をファイルに書き込みます。それぞれの 文字列を書き込む際にさらに改行文字が追加されることはありません。 配列は文字列を反復して取り出すことができる任意のオブジェクト でもかまいません。この操作はそれぞれの文字列を write() を呼んで 書き込むのと同等の操作です。