0

ラックスペースからログファイルを解析したい。公式の python sdkを使用しています。以前にファイルをディスクに保存し、そこからgzip.open.

現在、私はherokuを使用しており、ファイルをディスクに保存できない/保存したくないが、メモリ内で解凍を行います。

ただし、オブジェクトを文字列または疑似ファイル オブジェクトとしてダウンロードして処理することはできません。

誰かがアイデアを持っていますか?

logString = ''
buffer = logfile.stream()

while True:
    try:
        logString += buffer.next()
    except StopIteration:
        break

# logString is always empty here

# I'd like to have something that enables me to do this:
for line in zlib.decompress(logString):
    # having each line of the log here

アップデート

空の文字列が完全に真実ではないことに気付きました。これはループを通過しており、最初の出現だけが空です。次の発生時にはデータがあります (gzip されているように見えます) が、次の zlib エラーが発生します。

zlib.error: Error -3 while decompressing data: incorrect header check

アップデートⅡ

提案どおり、cStringIO を実装しましたが、同じ結果になりました。

 buffer = logfile.stream()
     output = cStringIO.StringIO()

         while True:
             try:
                  output.write(buffer.next())
             except StopIteration:
             break

         print(output.getvalue())

更新 III これは現在動作します:

output = cStringIO.StringIO()

try:
    for buffer in logfile.stream():
        output.write(buffer)
except StopIteration:
    break

そして、少なくともここでクラッシュはありませんが、実際の行は得られないようです:

for line in gzip.GzipFile(fileobj=output).readlines():
    # this is never reached

ここをどう進めますか?受信データを通常の文字列として表示して、正しい方法であるかどうかを知る簡単な方法はありますか?

4

1 に答える 1

0

これread()もオプションであり、次のような簡単な解決策につながることがわかりました。

 io = cStringIO.StringIO(logfile.read())
     for line in GzipFile(fileobj=io).readlines():
         impression = LogParser._parseLine(line)
         if impression is not None:
             impressions.append(impression)
于 2012-12-04T08:56:05.053 に答える