は、おそらくより良い答えがある...しかし、私はこの問題に直面してきたとき、私は私に、この問題に対する簡単な解決策を与えた私はすでに個別の異なる部分にアクセスしたいファイルを、持っていました。
たとえば、たとえば、chunkyfoo.bin
は、6バイトのヘッダー、1024バイトのnumpy
アレイ、およびもう1つの1024バイトのnumpy
アレイで構成されるファイルです。 numpy.fromfile
は最初に0に戻るlseek
であるため、ファイルを開いて6バイトを検索することはできません。しかし、あなたはちょうどmmap
ファイルをすることができますし、代わりにfromstring
を使用します。これは、あなたがしたい正確に何のように聞こえる
with open('chunkyfoo.bin', 'rb') as f:
with closing(mmap.mmap(f.fileno(), length=0, access=mmap.ACCESS_READ)) as m:
a1 = np.fromstring(m[6:1030])
a2 = np.fromstring(m[1030:])
。実際の生活の中でa1
とa2
にオフセットと長さは、おそらくかなりのコメントを固定されているよりも、ヘッダに依存していることを、もちろん、除きます。
ヘッダーはちょうどm[:6]
であり、struct
モジュールを使用して明示的に引き離すか、またはread
データを使用して解析することができます。しかし、m
を構築する前にseek
とread
からf
に明示的にseek
とをコールすることもできます。a1
とa2
に影響することなく動作します。
class SeekedFileWrapper(object):
def __init__(self, fileobj):
self.fileobj = fileobj
self.offset = fileobj.tell()
def seek(self, offset, whence=0):
if whence == 0:
offset += self.offset
return self.fileobj.seek(offset, whence)
# ... delegate everything else unchanged
私は「変わらない他のすべてを委任する」でしたことにより、このよう
私は別の非numpy
関連のプロジェクトのためにやったの代替は、ラッパーファイルオブジェクトを作成することです、建設時間に属性のlist
を生成し、それを__getattr__
で使用していますが、おそらく何かよりハッキリではありません。 numpy
は、ファイルのようなオブジェクトのメソッドのほんの一例にしか依存せず、正しく文書化されていると思いますので、明示的にそれらを委譲してください。しかし、私はあなたが明示的seek
ベースのコードの束の上にポートを機械的にしようとしている場合を除きmmap
ソリューションは、こちらより理にかなっていると思います。 (mmap
はnumpy.array
の代わりにnumpy.memmap
のままにしておくこともできます。numpy
はページングなどの制御をより多く制御できますが、実際にはnumpy.memmap
とmmap
を取得するのはかなりトリッキーです一緒に仕事をする。)
ダン、ファイル名の代わりにファイルオブジェクト!これはまさに私が探しているものです、これはfromfileのドキュメントに追加する必要があります...ありがとう! – brorfred