【初月無料キャンペーン中】gooドクター

python初心者なので、できるだけお手柔らかにお願いします。
pythonのバージョンは2.7.3です。

=====================================================
あるバイナリデータ(test.bin)から、
2バイトずつ100*100の2次元配列に読み込ませたいのですが、
配列への読み込ませ方が分からず悩んでいます。
=====================================================


#### ここから sampleスクリプト(未完) ################

f = open("./test.bin", "rb")

x = 100
y = 100
bytesize = 2

data = f.read(bytesize*x*y)

array = [[0 for j in range(x)] for i in range(y)]
##############################################

上記の後、arrayの各要素に2byteずつ整数値としてデータを読み込ませたいのですが、
dataからarrayへの受け渡し方法が分からず悩んでいます。
かなり初歩的な質問かも知れませんが、ヒントでもいいので教えて下さい。

また、上記の時点で誤っていることがありましたら
ご教授お願いします。

gooドクター

A 回答 (1件)

http://docs.python.jp/2/library/stdtypes.html#fi …
にあるように、ファイルオブジェクトのreadはstringを返します。つまり、
data = f.read(bytesize*x*y)
なら、dataがstringです。
stringなので、Xバイト目の「文字」は
data[X]
で取り出せます。
これは、元のバイナリデータの1バイトを、対応する「文字」にしたものです。元のバイナリデータを得るには、逆変換する必要があります。文字のコードを得るのには、ord関数( http://docs.python.jp/2/library/functions.html#ord )を使います

ord(data[X])

2バイトから16bitの整数を取るには、まず、2バイトそれぞれの値を得ます
a0=ord(data[X0])
a1=ord(data[X1])
ここで、上位を8ビット左へシフトして、下位とのORを取れば、16ビットになります。
ただ、上記のa0,a1のどちらが上かは、どう保存したかによるので、今ある情報だけでは判断できません。
# a0が上なら
Y=a0 << 8 | a1

また、符号有り16bit整数だと、もう少し複雑になります。


全てのi,jについて、array[i][j]に対応するバイト位置 X0,X1 を求め、計算した値を代入する、という流れになります
    • good
    • 0
この回答へのお礼

素早いご回答ありがとうございます。
思っていたより、複雑な手順が必要になるのですね。。。

いろいろと検索した結果、
私の場合、配列を多用することになりそうなので、
できるだけシンプルな手順で書けるように、
numpyというのを利用しようかと考えています。

まだ試行錯誤中ですが、一応参考までに
numpyを利用して以下のようなコードを書いています。

#########################################
import numpy as np

filename = './test.bin'
data = np.fromfile(filename, dtype='H')

array = data.reshape(100,100)
#########################################

お礼日時:2013/03/13 02:04

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

gooドクター

人気Q&Aランキング