非常に大きなFortranのフォーマットされていないバイナリファイルをPythonで読み込もうとしています。このファイルには2^30の整数が含まれています。
レコードマーカーが混乱していることがわかりました(最初のものは-2147483639です)、とにかくデータ構造を回復することを達成しました(これらの必要な整数はすべて類似しているため、レコードマーカーとは異なります)、以下のコードを記述します(ここの助けを借りて) )。
ただし、各レコードの最初と最後のマーカーが同じではないことがわかります。何故ですか?
データのサイズが長すぎるためですか(536870910 =(2 ^ 30-4)/ 2)?しかし、(2 ^ 31-1)/ 4 =536870911>536870910。
それとも、データファイルの作成者が犯した間違いですか?
別の質問、レコードの先頭にあるマーカーのタイプ、intまたはunsigned intは何ですか?
fp = open(file_path, "rb")
rec_len1, = struct.unpack( '>i', fp.read(4) )
data1 = np.fromfile( fp, '>i', 536870910)
rec_end1, = struct.unpack( '>i', fp.read(4) )
rec_len2, = struct.unpack( '>i', fp.read(4) )
data2 = np.fromfile( fp, '>i', 536870910)
rec_end2, = struct.unpack( '>i', fp.read(4) )
rec_len3, = struct.unpack( '>i', fp.read(4) )
data3 = np.fromfile( fp, '>i', 4)
rec_end3, = struct.unpack( '>i', fp.read(4) )
data = np.concatenate([data1, data2, data3])
(rec_len1,rec_end1,rec_len2,rec_end2,rec_len3,rec_end3)
上記のように読み取られたレコード長の値は次のとおりです。
(-2147483639, -2176, 2406, 589824, 1227787, -18)