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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Python

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

Q&A

2回答

6700閲覧

str型の書式変更について

ryotail

総合スコア13

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Python

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

0グッド

0クリップ

投稿2018/11/01 09:10

前提・実現したいこと

プログラミング初心者です。
pythonでバイナリファイルを展開したあと、数値の書式変更を行いたいです。

発生している問題・エラーメッセージ

import struct

cont = open('0000001.dat', 'rb').read()
data = struct.unpack('f'*(len(cont)//4), cont)

print('{:<10}'.format(data))

バイナリファイルを展開したプログラムは上記の通りです。
これを実行すると、
, 0.1923999935388565, 0.13459999859333038, 0.13130000233650208, 0.1282999962568283, 0.15760000050067902, 0.2076999992132187, 0.2378999888896942, 0.24269999563694, 0.23349998891353607, 0.21539999544620514, 0.20709998905658722, 0.18629999458789825, 0.18569999933242798, 0.19999998807907104, 0.18029999732971191, 0.10920000076293945, 0.10939999669790268, 0.10679999738931656, 0.1030999943614006, 0.1030999943614006, 0.11879999935626984, 0.10809999704360962, 0.11729999631643295, 0.11659999936819077, 0.10740000009536743, 0.10659999400377274, 0.09910000115633011, 0.0843999981880188, 0.0729999989271164, 0.08179999887943268, 0.08460000157356262, 0.0997999981045723, 0.12189999967813492, 0.1410999894142151, 0.15479999780654907, 0.1889999955892563, 0.23979999125003815, 0.2459999918937683, 0.2377999871969223, 0.2312999963760376, 0.2393999993801117, 0.23569999635219574, 0.22089999914169312, 0.19189999997
みたいな感じに表示され見にくいので、小数点以下を5桁くらいに調節したいです。

###試した事

print('{:<10}'.format(data))
というコードを、
print('{:.5f}'.format(data))などに変えて実行してみたら
ValueError: Unknown format code 'f' for object of type 'str'
というエラーがでてしまいました。

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

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

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

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

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

tachikoma

2018/11/01 09:57

Python2.7じゃなくて3系っぽいコードですね。
ryotail

2018/11/01 12:03

python2.7と3系ではコードが全然違うんですか??
tachikoma

2018/11/01 12:14 編集

Pythonの3系は後方互換性がないアップデートなんです。printがキーワード(予約語)だったのが関数に変わったのが最たる例ですね。
ryotail

2018/11/01 12:53

なるほど、ご丁寧にありがとうございます^^
guest

回答2

0

ValueError: Unknown format code 'f' for object of type 'str'

これは、str型のデータをfというfloatのフォーマッティングで処理出来ない、というエラーメッセージです。
data に文字列が入っていると思うので、コードを確認してみてください。

手元で、書いてみると、小数点以下5桁は以下のようにできました。

python

1>>> count = b'\1\1\1\1' 2>>> data = struct.unpack('f'*(len(count)//4),count) 3>>> print('{:<10.5}'.format(data[0])) 42.3694e-38

追記

複数要素に対しては以下の様にプリントします。

python

1>>> count = b'\1\1\1\1\2\2\2\2\3\3\3\3' 2>>> data = struct.unpack('f'*(len(count)//4),count) 3>>> for d in data: 4... print('{:<10.5}'.format(d)) 5... 62.3694e-38 79.5515e-38 83.8501e-37 9>>> for d in data: 10... print('{:<10.5}'.format(d), end=', ') 11... 122.3694e-38, 9.5515e-38, 3.8501e-37,

投稿2018/11/01 10:08

編集2018/11/01 15:04
shimizukawa

総合スコア1847

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

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

ryotail

2018/11/01 13:04

0000001.datの中には31*31px分の値が入ってて、 >>> print('{:10.5}'.format(data[0])) と1つだけなら値がちゃんと出たのですが、[0]の部分を外すと上手く実行できませんでした、、、
guest

0

Python

1s = """, 0.1923999935388565, 0.13459999859333038, 0.13130000233650208, 0.1282999962568283, 0.15760000050067902, 0.2076999992132187, 0.2378999888896942, 0.24269999563694, 0.23349998891353607, 0.21539999544620514, 0.20709998905658722, 0.18629999458789825, 0.18569999933242798, 0.19999998807907104, 0.18029999732971191, 0.10920000076293945, 0.10939999669790268, 0.10679999738931656, 0.1030999943614006, 0.1030999943614006, 0.11879999935626984, 0.10809999704360962, 0.11729999631643295, 0.11659999936819077, 0.10740000009536743, 0.10659999400377274, 0.09910000115633011, 0.0843999981880188, 0.0729999989271164, 0.08179999887943268, 0.08460000157356262, 0.0997999981045723, 0.12189999967813492, 0.1410999894142151, 0.15479999780654907, 0.1889999955892563, 0.23979999125003815, 0.2459999918937683, 0.2377999871969223, 0.2312999963760376, 0.2393999993801117, 0.23569999635219574, 0.22089999914169312, 0.19189999997""" 2 3nums = s.split(",") 4# 桁数を調整しないなら 5print(*nums, sep="\n") 6 7# 桁数を調整するなら 8for n in nums[1:]: # 一個目だけ空なので省く 9 print("{:0.5f}".format(float(n)))

投稿2018/11/01 10:02

編集2018/11/01 10:02
tachikoma

総合スコア3601

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問