2013-08-07 7 views
10

Pythonを使用してgzip形式のテキストファイルをオンザフライで追加することはできますか?Python Gzip - オンザフライでのファイルへの追加

import gzip 
content = "Lots of content here" 
f = gzip.open('file.txt.gz', 'a', 9) 
f.write(content) 
f.close() 

行がファイルに6秒ごとに(注意「追加」)またはその付加されますが、結果のファイルは、標準の非圧縮ファイルと同じくらい大きいです - :

は基本的に私はこれをやっています(完了したら約1MB)。

明示的に圧縮レベルを指定しても違いはありません。

既存の圧縮されていないファイルを後でgzipすると、サイズは約80kbになります。

その場でgzipファイルに「追加」することができず、圧縮されていると思いますか?

これはString.IOバッファに書き込んだ後、完了したらgzipファイルにフラッシュするケースですか?

+4

gzipアルゴリズムを効率的に機能させるには、圧縮するコンテンツ全体に手を加える必要があります。それ以外の場合は、gzipされたコンテンツのチャンクを互いに追加するだけです。 – Nadh

+0

@Nadhだから私の最終行は正しいと思いますか? String.IOに書き込み、gzipにフラッシュしますか? –

+1

はい、うまくいくはずです。任意の瞬間にすべてのコンテンツが一緒にgzipされていることを確認するだけです。 – Nadh

答えて

9

gzip形式では連結されたgzipストリームが許可されているため、有効なgzipファイルの作成と保守という意味で機能します。

しかし、gzip圧縮の各インスタンスに使用するデータが少なくて済むので、圧縮が難しいという意味では機能しません。圧縮は以前のデータの履歴を利用することに依存しますが、ここではgzipは基本的には何も与えられていません。

gzipを呼び出してファイルに追加する前に、少なくとも数Kのデータを蓄積するか、多くの行を詰めるか、b)単一のgzipストリームに追加するもっと洗練された方法有効なgzipストリームが毎回残され、データの効率的な圧縮が可能になります。

例b)の例は、Cでは、gzlog.hgzlog.cです。私はPythonがgzlogをPythonで直接実装するために必要なzlibへのインタフェースをすべてPythonに持っているとは思っていませんが、PythonのCコードにインタフェースすることができます。