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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

6543閲覧

対処方法:a bytes-like object is required, not 'str'

ojioji

総合スコア11

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2018/02/07 02:08

前提・実現したいこと

python初心者です。
float型の配列を1件ずつ読み込み、byteに変換したのですが、当該エラーが発生してしまいます。
[float(x)]としても何故「str」扱いされるのか不明です。
解消方法がわからないため、どこが誤っているかご教授をお願い致します。

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

a bytes-like object is required, not 'str'

該当のソースコード

fPath = "./tmp.img" if os.path.isfile(fPath) == False: return -1 F = open(fPath, 'wb') try: for x in buf <- float型の値が入った配列: F.write('%08x' % struct.unpack('<L',struct.pack('>f',float(x)))[0]) <- エラー発生個所 finally: F.close()

「'%08x' % struct.unpack('<L',struct.pack('>f',1.0))[0])」とした場合は、正常に変換されました。

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答1

0

ベストアンサー

'%08x' % struct~の結果データは文字列(str)です。
このデータを.write()しているので提示エラーが発生しています。
つまりF.write('abc')と同様のエラーが発生しています。

ちょっと欲しい出力結果が分かりませんが、.encode()にてstrbytes型に変換することで書き込みはできるようになります。

Python

1import struct 2F = open('ret.dat', 'wb') 3try: 4 for x in [1.0]: 5 dat = float(x) 6 print(type(dat), dat) # <class 'float'> 1.0 7 8 dat = struct.pack('>f',dat) # float BE -> bytes 9 print(type(dat), dat) # <class 'bytes'> b'?\x80\x00\x00' 10 11 dat = struct.unpack('<L', dat) # bytes -> unsigned long LE 12 print(type(dat), dat) # <class 'tuple'> (32831,) 13 14 dat = dat[0] 15 print(type(dat), dat) # <class 'int'> 32831 16 17 dat = '%08x' % dat # この結果はstrになりバイナリwriteできない! 18 print(type(dat), dat) # <class 'str'> 0000803f 19 20 dat = dat.encode() # bytesに変換する 21 print(type(dat), dat) # <class 'bytes'> b'0000803f' 22 23 F.write(dat) # OK 24finally: 25 F.close()

ret.dat HEX表示

PlainText

130 30 30 30 38 30 33 66 0000803f

投稿2018/02/07 02:49

can110

総合スコア38233

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

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

ojioji

2018/02/07 03:28

ご回答ありがとうございます。 エラーが解消されファイル書き込みができました! もう1点教えていただきたいのですが、書き込んだファイルをエディタで開きますと、バイナリファイルとして書き込みが行われておりません。 「F = open('ret.dat', 'wb')」とバイナリ指定しているのに何故、バイナリ形式で書き込まれないのでしょうか? 別途エンコードが必要なのでしょうか?
can110

2018/02/07 04:41

その出力ファイル結果がバイナリかテキストかは無関係で、それを読み込んで解釈するほうの問題です。 提示コードでは、最終的に文字列からバイトデータを生成しているので、先頭から文字「0」=0x30 などが書き込まれています。 これをバイナリとして見れば「0x30」という値ですし テキストとして見れば「0」と見えるというだけです。 で、[ 0x30, 0x80, 0x00, 0x00] の4byteをそのまま書き込みたい場合は F.write( struct.pack('>f',float(x))) でよいです。
ojioji

2018/02/07 06:26

ご回答ありがとうございます。 もう少し自分で調べてみます! ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問