3

データの配列を含む bz2 圧縮バイナリ (ビッグ エンディアン) ファイルがあります。外部ツールで圧縮解除し、ファイルを Numpy に読み込むと、次のように機能します。

import numpy as np
dim = 3
rows = 1000
cols = 2000
mydata = np.fromfile('myfile.bin').reshape(dim,rows,cols)

ただし、このようなファイルは他にもたくさんあるため、事前に個別に抽出することはできません。したがって、Python で bz2 モジュールを見つけたので、Python で直接解凍できる可能性があります。ただし、次のエラー メッセージが表示されます。

dfile = bz2.BZ2File('myfile.bz2').read()
mydata = np.fromfile(dfile).reshape(dim,rows,cols)

>>IOError: first argument must be an open file

明らかに、BZ2File 関数はファイル オブジェクトを返しません。圧縮ファイルを読む正しい方法を知っていますか?

4

1 に答える 1

5

BZ2File ファイルのようなオブジェクトを返します (ただし、実際のファイルではありません) 問題は、あなたがそれを呼び出しread()ていることです:

dfile = bz2.BZ2File('myfile.bz2').read()

これにより、ファイル全体が 1 つの大きな文字列としてメモリに読み込まれ、それが に渡されfromfileます。

およびのバージョンnumpypythonプラットフォームによっては、実際のファイルではないファイルのようなオブジェクトからの読み取りが機能しない場合があります。その場合、 で読み込んだバッファを使用できますfrombuffer

したがって、次のいずれかです。

dfile = bz2.BZ2File('myfile.bz2')
mydata = np.fromfile(dfile).reshape(dim,rows,cols)

…またはこれ:

dbuf = bz2.BZ2File('myfile.bz2').read()
mydata = np.frombuffer(dbuf).reshape(dim,rows,cols)

(言うまでもなく、バッファ全体をメモリに読み込むよりも優れた方法が他にもたくさんあります。ただし、ファイルがそれほど大きくない場合は、これでうまくいきます。)

于 2013-04-15T09:57:41.173 に答える