FC2ブログ

頭と尻尾はくれてやる!

パソコンおやじのiPhoneアプリ・サイト作成・運営日記


浮動小数点数を持つバイナリファイルをPythonで読み込む

macOSで保存したデータファイルからPythonで画像を作成する
↑この続き。

前記事では8bit(1バイト)の輝度情報がずらーっとピクセルの個数分入ったバイナリデータを読み込んだけど、コードではどこにも8bitと指定していない。

書いたコードがたまたま1バイトずつ読むようになってたのでうまく行ったんだろう。

では浮動小数点数では?
ということで確認してみた。

macOSアプリ側で今度は10個のfloat値をバイナリで保存する。
{
    // float値を作成
    NSUInteger nofData = 10;
    float *data = calloc(nofData , sizeof(float));
    for (NSUInteger ite=0; ite<nofData; ite++) {
        data[ite] = (float)ite/10.0;
    }
    
    // チェック
    for (NSUInteger ite=0; ite<nofData; ite++) {
        NSLog(@"data[%ld] = %f",ite,data[ite]);
    }

    // 保存する
    NSString *filePath = …
    NSData *nsdata=[NSData dataWithBytes:data length:nofData*sizeof(float)];
    [nsdata writeToFile:filePath atomically:YES];
}
作成したデータの確認画像

↑チェックの結果。0から0.1きざみに10個。

作成したファイルの情報

↑macOSのfloatは32bitなので4バイト。それが10個なので40バイトのファイルができた。


次にこのバイナリファイルをPython側で読み込む。

まず、前記事のコード(↓こんな感じ)だと、、、
{
    fid = open(FilePath, "rb")
    data = fid.read()
    for ite in range(10) :
        r = data[ite]
        print("data[%d]=%f"%(ite,r))
}
読み込んだデータ表示結果1

↑やっぱり正しく読めない。


struct.unpackを使う場合。下に参考ページのリンクあり。
{
    import struct

    fid = open(FilePath, "rb")

    for ite in range(10) :
        r = struct.unpack('f', fid.read(4))
        print("data[%d]=%f"%(ite,r[0]))
}
↑read(4)で4バイトずつ読む。
それを浮動小数点数ですよ、としてunpackする。4バイトの並びはデフォでいいみたい。

読み込んだデータ表示結果2

↑正しく読み込めた!代わり映えしない画像だけど😅
{
    import array

    fid = open(FilePath, "rb")
    a = array.array('f')
    a.fromfile(fid, 10)
    for ite in range(10) :
        r = a[ite]
        print("data[%d]=%f"%(ite,r))
}
↑他にもこのような方法もあるみたいだけど、前者の方が個人的には好きかな。


macOS High Sierra 10.13.6
Python 3.5.2 |Anaconda 4.1.1 (x86_64)


参考ページ
struct.unpack('f', fid.read(4)) 



<< macOSをMojaveにアップデートしたらスタックが快適  TopPage  macOSで保存したデータファイルからPythonで画像を作成する >>

コメント


管理者にだけ表示を許可する
 

トラックバック

トラックバックURL
http://ringsbell.blog117.fc2.com/tb.php/1226-addd781d




Copyright ©頭と尻尾はくれてやる!. Powered by FC2 Blog. Template by eriraha.

FC2Ad