2016-05-11 33 views
1

のバイナリファイルを読む私は、バイナリファイルが存在し、複数の種類があり、私は組織を知って、次の方法numpyの構造化された配列

numpy.fromfile(file, dtype=) 

を使用してバイナリファイルを読んでいます。次のようにそのため私は、DTYPE配列を定義しています

dtypearr = [('a','i4',1),('b','S1',8),('c','i4',1), 
('d','i4',1),('e','S1',8)] 

このDTYPE配列は、バイナリファイルの最初の値が8つの文字などが続い1つの整数であることを言っている...

を私が午前問題バイナリファイルがdtypearrのサイズでないことです。バイナリファイルは、dtypearr で定義された構造をn回()繰り返す。

これまでのところ、バイナリファイルと同じサイズになるまで、新しいフィールド名でdtypearrを繰り返しています。

しかし、私は何とか、私はdtypearrを繰り返さずにこの目標を達成できることを望んでいました。代わりに、各フィールドに配列を格納する必要があります。たとえば、私はstructuredarray ['a']またはstructuredarray ['b']を使用して、単一の値ではなく配列を指定します。

編集

なお:

numpy.fromfile(file, dtype=dtypearr) 

パターンがまったく同じであるとき、私が欲しいものを実現しました。以下の解決策も機能します。

しかし、私が言及したバイナリファイルのパターンは正確に繰り返されていません。たとえば、ヘッダー部分と複数のサブセクションがあります。各サブセクションには独自の繰り返しパターンがあります。 f.seek()は最後のサブセクションでは動作しますが、前のサブセクションでは機能しません。

+0

あなたが求めていることは少し混乱しているようですね。バイナリ形式の場合はいくつかのサンプルデータを用意し、次にメークアップデータを提供してください。また、あなたが試したコードと失敗したコードを教えてください。 – pmaniyan

+0

私はあなたが基本的なファイルの読み込みルーチン、ヘッダー、セクション、繰り返しパターンを自分で操作する必要があると思います。アレイの作成は最後のステップになります。 – hpaulj

+0

はい、私のコードはもともとはどうでしたか、私は各サブセクションに対してnumpy.fromfileを呼び出さなければならないと思います。f.seekとnumpy.fromfileの "count"オプションの組み合わせで、 – snowleopard

答えて

3

試してみてください。

import numpy as np 
import string 

# Create some fake data 
N = 10 
dtype = np.dtype([('a', 'i4'), ('b', 'S8'), ('c', 'f8')]) 
a = np.zeros(N, dtype) 
a['a'] = np.random.random_integers(0,3, N) 
a['b'] = np.array([x for x in string.ascii_lowercase[:N]]) 
a['c'] = np.random.normal(size=(N,)) 

# Write to a binary file 
a.tofile('test.dat') 

# Read data into new array 
b = np.fromfile('test.dat', dtype=dtype) 

配列ab(すなわちnp.all(a['a'] == b['a']) is True)同じです:

for col in a.dtype.names: 
    print col, np.all(a[col] == b[col]) 

# Prints: 
# a True 
# b True 
# c True 

更新:あなたはヘッダ情報をしている場合は

、あなたが最初に開くことができますファイル、データの開始点を探して、次に読み取ります。たとえば:

f = open("test.dat", "rb") 
f.seek(header_size) 
b = np.fromfile(f, dtype=dtype) 
f.close() 

あなたはサイズ(header_sizeを)知っている必要がありますが、その後、あなたは良いことがあります。サブセクションがある場合は、取得するアイテムの数をカウントできます。カウントが機能するかどうかはテストしていません。このバイナリ形式に縛られていないなら、hdf5のようなものを使って複数の配列を1つのファイルに保存することをお勧めします。

+0

驚くばかりですが、私が言及したことを忘れてしまった追加の重要な情報があります。私は自分の投稿を編集します。 – snowleopard

+0

ヘッダーをスキップする必要性を反映するように更新されました。 – JoshAdel

+0

はい、私はそれを期待していたので、別の編集を書いていました。迅速な対応をありがとうございます。問題は複数のサブセクションがあり、f.seekは最後のサブセクションのみで動作することです。申し訳ありませんが、私はこのような詳細に入る必要があるとは思わなかった。 – snowleopard

関連する問題