質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

4235閲覧

pythonでバイナリファイルを扱いたい

python_wakaran

総合スコア13

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/06/02 14:44

Pythonで図1のようなバイナリファイルを解析をしたいと考えています。
テキストファイルに変換すると情報の概要と、2048×2048の数値データとなっています。

バイナリファイル:xray-1.bin
図1:バイナリファイル:xray-1.bin

イメージ説明
図2:テキストファイル:xray-1.txt

最終的にはこのバイナリファイルをテキストファイルにあるような数値データに変換する手段を見つけたいと考えています。基本的にはpythonでjupyter labを用いて解析を行っています。

以下に私の試行錯誤した結果を示します。

Python

1with open('xray-1.bin', 'rb') as f: 2 b = f.read() 3 #513から数値データスタート 4 data = b[513:] 5print(data[:100])

Python

1#実行結果 2b'\x00\xf8\x00\x0f\x01\xe3\x00\xd6\x00\xd8\x00\xf1\x00\xe8\x00\xde\x00\x00\x01\xe0\x00\xda\x00\xd7\x00\xf1\x00\xe2\x00\xec\x00\xf1\x00\xfa\x00\xde\x00\xef\x00\xdc\x00\xdf\x00\x03\x01\xef\x00\xec\x00\xe1\x00\xf0\x00\x03\x01\xd5\x00\xd9\x00\xda\x00\xe3\x00\xd9\x00\xdf\x00\xea\x00\xf7\x00\xf9\x00\xfa\x00\xff\x00\xe2\x00\xd7\x00\xe2\x00\xe0\x00\xd6\x00\xe7\x00\xe2\x00\xeb\x00\xf4\x00\xe8\x00#\x01\xe4'

data内部の数値データを個別に算出します。

Python

1data[0] 2>> 0 3data[1] 4>> 248 5data[2] 6>> 0 7data[3] 8>> 15 9data[4] 10>> 1 11data[5] 12>> 227 13len(data) 14>> 8388607

また、図2に示しているテキストファイル形式での値の出力を5番目まで見てみると
213,248,271,227,214
となっており、バイナリファイルからの出力では欠損しているデータと表示できているデータが存在することがわかります。
その表示されているデータの間には基本的に0、もしくはここでいう1や15のような不必要なデータを含まれてしまっています。この不必要なデータによって本来のデータサイズは2048×2048で表せてほしいところ、lenで表示させたところそれよりも多い値が検出されていると考えられます。

ここで疑問なのが
⓵dataをまとめてprintするときと個別にプリントするときの出力形式の違いはなぜ生じるのか?
⓶バイナリファイルにおいて欠けている数値、不必要なデータというのは何が原因として出てきてしまうのか?
またそれを解決するための手段には何が考えられるのか?

以上がお分かりになる方がいらっしゃいましたら、アドバイスをいただきたいです。

よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/06/02 15:24 編集

その図2のxray-1.txt というテキストファイルは、何か特別なソフトを使ってバイナリファイルを変換したものなのでしょうか?
python_wakaran

2021/06/02 15:44

その通りです。 c言語を用いてバイナリ形式で得られたファイルをtxtに変換するプログラムを有していたので(自分で作ったものではないのですが)、それを用いて変換させたものとなっています。 しかしバイナリファイルのほうがパソコン容量が軽くて済むという点から、バイナリファイルから解析を行う方法を模索しているという経緯がありました。
python_wakaran

2021/06/02 15:55

その通りです。 バイナリ形式で得られたデータをテキスト形式に変換してくれるc言語のプログラムを有していました(詩文で作ったものではありませんが)。それを用いてこのテキストファイルを作成した形となります。
guest

回答2

0

ベストアンサー

何かのCMOSセンサから取得した画像データでしょうか。

先頭のヘッダに「12bit」と書いてあるので、513バイト目から始まるであろう画像データは1単位12bitと推測されます。実際にテキストファイルには8ビットの最大値である255よりも大きな数値が記録されています。
ファイルサイズが204820482ですね。なので1ピクセルあたり2バイトの領域を使っています。2バイトを1単位としてintに変換していきましょう。

なお、513バイト目から読み込みたい場合の指定は d[512:]です。配列の先頭は0番目。

投稿2021/06/02 15:18

hope_mucci

総合スコア4447

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

python_wakaran

2021/06/03 02:43

回答ありがとうございます。 その通りCMOSセンサから取得したデータです。12bitのことやファイルサイズのことなど自分では気づくことのできない要素でした。ありがとうございます。513バイト目というのは表記ミスでした。正しくは514バイト目でした。 また、「なので1ピクセルあたり2バイトの領域を使っています。2バイトを1単位としてintに変換していきましょう。」とありますが、例えば0番目と1番目の値が一つのピクセルの値を表しているということなのでしょうか?またdata[0]などではint形式で出力できているのですが、異なる方法でintに変換した方がよいということでしょうか?
hope_mucci

2021/06/03 05:47

> 例えば0番目と1番目の値が一つのピクセルの値を表している その通りです。 > またdata[0]などではint形式で出力できているのですが int形式での出力は出来ていません。readで読み込んだバイナリデータはbytes型データです。 from_bytesという便利なメソッドがあります。これで2バイトずつ変換していきましょう。 参考: https://blanktar.jp/blog/2014/10/python3-convert-int-bytes https://docs.python.org/ja/3/library/stdtypes.html#int.from_bytes
teamikl

2021/06/03 07:36 編集

16ビット(short) の配列に変換するなら、array モジュールも使えますよ。 https://docs.python.org/ja/3/library/array.html >>> from array import array >>> data = array("h", b'\xf8\x00\x0f\x01\xe3\x00\xd6\x00') >>> data array('h', [248, 271, 227, 214]) # 画像の数列の2番目~と一致。1番目の 213 が無いので 514 -> 512 で正しいのでは? ※ バイトオーダーが問題になる場合は必要に応じて data.byteswap() サイズが解っていて、ファイルから読むなら array.fromfile を使うと省メモリ
python_wakaran

2021/06/04 01:54

様々な回答ありがとうございます。 新たな知見も得られることができ、質問できてよかったと感じています。 これらのアドバイスを参考に再度取り組んでみたいと思います。
python_wakaran

2021/06/04 02:33

teamiklさんの方法を試した結果、正確なデータを得ることとができました! ありがとうございました。
guest

0

⓵dataをまとめてprintするときと個別にプリントするときの出力形式の違いはなぜ生じるのか?

dataとdata[0]は型が違うから
型によって出力形式が違う

⓶バイナリファイルにおいて欠けている数値、不必要なデータというのは何が原因として出てきてしまうのか? またそれを解決するための手段には何が考えられるのか?

バイナリファイルがどういう形式になっているのかは提供元しか知りません
何をもって欠けている、不必要といわれているのか分かりません
テキストファイルに256以上の値が出てくるということは、
一つのデータは2byteであらわされているということじゃないですかね

投稿2021/06/02 15:07

jamjam3

総合スコア165

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

python_wakaran

2021/06/03 02:48

回答ありがとうございます。 型が違うから出力形式が違ってくるということ、理解できました。ありがとうございます。 ここではテキストファイル内の数値データを完全に正しいものとしており、それと同じ数値データをバイナリファイルでも読み取れるようにしたいという意図がありましたので、テキストファイルと比べた時の欠けている、不必要という表現でした。説明不足で申し訳ございません。 一つのデータは2byteで表されているということはほかの回答者様と同様で、その通りであると気づきました。ご指摘ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問