1

私は次の機能を持っています:

def save(msg):
    with gzip.open("ircbot.log.gz", "ab") as f:
        f.write(msg+'\n')
        f.close()
        return "Succesfully logged: "+msg

各メッセージを.logファイルに追加したいのですが、機能せず、最初のメッセージのみが保存されます。

たとえば、これらの関数を呼び出した後:

save('first')
save('second')
save('third')

.logファイルには「first」のみが含まれます。

単純な.txtファイルの場合は正常に機能します。Gzipはファイルへの追加をサポートしていませんか?

4

3 に答える 3

3

ご存知のように、gzipストリームを連結して抽出可能なgzipファイルを作成する(つまりf.close()、各メッセージの後で)ことが機能します。これは、gzip標準では、現在のgzipストリームをデコードした後、別のgzipストリームを探すために準拠したデコンプレッサが必要なためです。ただし、メッセージが比較的短い場合(たとえば、1行か2行)、結果のgzipファイルは大きくなり、メッセージを含む単純なテキストファイルよりも小さくなりません。各メッセージには、少なくとも18バイトのgzipヘッダーとトレーラーのオーバーヘッドがあり、データは5バイト拡張され、メッセージごとに23バイトが追加される可能性があります。

各メッセージの後に使用しないという選択肢はf.close()、後のメッセージの圧縮が前のメッセージとの冗長性を利用できる単一のgzipストリームを作成することにより、データの実際の圧縮をもたらします。ただし、これには、最終的にを呼び出すまで、完全で正しいgzipファイルがないという欠点がありますf.close()。さらに、ブロックを圧縮するのに十分な量が蓄積されるまで、メッセージはまったく書き込まれません(メッセージが短い場合も同様です)。次に、束が一気に書き込まれ、ファイルはさらに蓄積されるのを再び待ちます。

これに対する解決策はありますが、Pythonにはそれを許可するのに十分なzlibへのインターフェースがあるとは思いません。C、gzlog.hgzlog.cの例を見ると、ログエントリがすぐにgzipファイルに書き込まれ、常にログファイルが完全で正しい状態のままになります。

于 2012-12-22T16:54:39.987 に答える
0

わかりました、わかりました。

Altap Salmanderを使用して.gzを抽出し、ログファイルを表示しました(F3関数)。

7zipを使用してクラシックエクスプローラーでgzファイルを抽出すると、すべてのメッセージがそこにありました。

于 2012-12-22T13:35:10.683 に答える
0

f.close()このスクリプトによって作成されたgzipファイルと通常のgzipコマンドによって作成されたgzipファイルの両方で、余分なLinux、python-2.7がなくても機能します。

于 2012-12-22T13:53:36.773 に答える