私はstruct.unpack
で大きな問題を抱えています。私は、MATLABまたはPythonで書かれた、あらかじめ決められたフォーマットのバイナリファイルを持っています。PythonからMATLABで書かれたバイナリファイルの解析(その逆)
バイナリデータをPythonでファイルに書き込んで、問題なくデータを読み戻すことができます。同じデータをMATLABのバイナリファイルに書き込んでMATLABで問題なく読み込むこともできます。
MATLABからデータを書き込んで、Pythonでデータを読み込もうとするとき、またはPythonでデータを書き込んでMATLABで読み返すときに問題が発生します。
簡単にするために、2つの整数をバイナリファイル(ビッグエンディアン)に書き込んでいます。各整数は4バイトです。最初の整数は、4バイトを超える有効でない整数であり、2番目の整数のいずれか1、2、または3
まず等しくなければなりません、ここで私はMATLABで私のデータを書き込む方法です:
fid=fopen('hello_matlab.test','wb');
first_data=4+4;
second_data=1;
fwrite(fid,first_data,'int');
fwrite(fid,second_data,'int');
fclose(fid);
fid=open('hello_python.test','wb')
first_data=4+4
second_data=1
fid.write(struct.pack('>i',first_data))
fid.write(struct.pack('>i',second_data))
fid.close()
:私はPythonでデータを書き込む方法をここでは、今
fid=fopen('hello_matlab.test','rb');
first_data=fread(fid,1,'int');
second_data=fread(fid,1,'int');
fprintf('first data: %d\n', first_data);
fprintf('second data: %d\n', second_data);
fclose(fid);
>> first data: 8
>> second data: 1
です:
そして、ここでは、私はMATLABでその背中を読む方法です
そしてここで私はそのデータをどのようにしてPythonで読むのですか?また、コメントアウトされた部分は機能しました(Pythonで書かれたファイルを読むとき)。私はもともと奇妙な何かがstruct.calcsize('>i')
が計算されていた方法で起こっていたと思ったので、私はそれを削除し、代わりに入れて、ハードコードされ、私はそれをエンコードする際にMATLABを使用していた知っていたバイトの量を表すために、INTEGER_SIZE
、定数:
INTEGER_SIZE=4
fid=open('hello_python.test','rb')
### FIRST WAY I ORIGINALLY READ THE DATA ###
# This works, but I figured I would try hard coding the size
# so the uncommented version is what I am currently using.
#
# first_data=struct.unpack('>i',fid.read(struct.calcsize('>i')))[0]
# second_data=struct.unpack('>i',fid.read(struct.calcsize('>i')))[0]
### HOW I READ DATA CURRENTLY ###
first_data=struct.unpack('>i',fid.read(INTEGER_SIZE))[0]
second_data=struct.unpack('>i',fid.read(INTEGER_SIZE))[0]
print "first data: '%d'" % first_data
print "second data: '%d'" % second_data
fid.close()
>> first data: 8
>> second data: 1
ここで、hello_python.test
をMATLABで読みたいとします。私の現在のMATLABコードでは、新しい出力は次のようになります。
>> first data: 419430400
>> second data: 16777216
これは奇妙なので、私はその逆でした。私はhello_matlab.test
を読むと何が起こるかを見ました。私の現在のPythonのコードでは、ここに新しい出力がある:だから
>> first data: 419430400
>> second data: 16777216
、奇妙な何かが起こっているが、私はそれが何であるかを知りません。また、これは大きなプロジェクトの一部ですが、私はコードのこれらの部分を新しいプロジェクトに抽出し、上記の例をこれらの結果でテストしました。私は、このファイルがポータブルにする方法については本当に困惑している:(任意の助けいただければ幸い
ビッグエンディアン形式で値を書き込んでいることを示すMATLABコードには何も表示されません。私は彼らがリトルエンディアン形式で書かれていると思われます。だから、Pythonコードを読むときは、 '
また、MATLABファイル全体を書き込んだ後、そのファイルをPythonで開き、内容全体を読むための簡単な 'fid.read()'を実行した結果はどうですか? –
これは役に立ちますか? http://stackoverflow.com/questions/874461/read-mat-files-in-python – cdarke