1

Pythonでメモリ内の* .bz2ファイルを解凍するには? bz2 ファイルは csv ファイルから取得されます。

以下のコードを使用してメモリ内で解凍しますが、動作しますが、csv ファイルのファイル名や作成者名などのダーティ データをもたらします。それを処理するための他の良い方法はありますか?

#!/usr/bin/python
# -*- coding: utf-8 -*-
import StringIO
import bz2


with open("/app/tmp/res_test.tar.bz2", "rb") as f:
    content = f.read()

    compressedFile = StringIO.StringIO(content)
    decompressedFile = bz2.decompress(compressedFile.buf)
    compressedFile.seek(0)

    with open("/app/tmp/decompress_test", 'w') as outfile:
        outfile.write(decompressedFile)

私はこの質問を見つけました、それはgzipにありますが、私のデータはbz2形式です。指示どおりに実行しようとしましたが、bz2はこの方法では処理できなかったようです.

編集:

@metatoasterまたは上記のコードの答えに関係なく、どちらも最終的な解凍ファイルにさらにダーティデータをもたらします。例: 私の元のデータは、res_test.csv という名前の csv 形式で以下に添付されています。 ここに画像の説明を入力

次に、ファイルがあるディレクトリにcdして圧縮しtar -cjf res_test.tar.bz2 res_test.csv、圧縮ファイルres_test.tar.bz2を取得します。このファイルは、インターネットから取得するbz2データをシミュレートでき、キャッシュせずにメモリで解凍したい最初にディスクに入れますが、取得するのは以下のデータであり、ダーティデータが多すぎます: ここに画像の説明を入力

データはまだそこにありますが、ノイズに沈んでいます。元のデータとまったく同じ純粋なデータに解凍して、あまりにも多くのノイズから実際のデータを抽出するのではなく、解凍することは可能ですか?

4

1 に答える 1

3

一般的な bz2 解凍には、BZ2Fileclass を使用できます。

from bz2 import BZ2File
with BZ2File("/app/tmp/res_test.tar.bz2") as f:
    content = f.read()

contentファイルの解凍された内容が含まれている必要があります。

ただし、これがtarファイル (通常はファイルのディレクトリとしてディスクに抽出されるアーカイブ ファイル) である場合、tarfile代わりにモジュールを使用でき、bz2 を処理するための拡張モード フラグがあります。ターゲットファイルに が含まれていると仮定するとres_test.csv、次を使用できます

tf = tarfile.open('/app/tmp/res_test.tar.bz2', 'r:bz2')
csvfile = tf.extractfile('res_test.csv').read()

r:bz2フラグは、後方シークを可能にする方法で tar アーカイブを開きます。代替方法では、 によって返されるメンバーから抽出ファイルを呼び出すことが実際的ではないため、これは重要r|bz2ですextractfile。2 行目は、単にアーカイブ ファイルextractfileの内容を文字列として返すように呼び出します。'res_test.csv'

ただし、通常は透過的なオープン モード ( 'r:*') をお勧めします。そのため、代わりに gzip を使用して入力 tar ファイルを圧縮しても、エラーは発生しません。

当然、モジュールには、任意のストリーム オブジェクトで使用できるtarfile下位レベルのメソッドがあります。openファイルが既に使用されている場合はBZ2File、これも使用できます

with BZ2File("/app/tmp/res_test.tar.bz2") as f:
    tf = tarfile.open(fileobj=f, mode='r:')
    csvfile = tf.extractfile('res_test.csv').read()
于 2017-09-19T04:00:28.453 に答える