質問するログイン新規登録

Q&A

解決済

1回答

1748閲覧

pythonのエンコードのエラーについて

todasan

総合スコア101

Python 3.x

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

0グッド

0クリップ

投稿2022/11/11 09:34

編集2022/11/11 10:33

0

0

python3.9.12を使っています。
プログラムのファイルはUTF-8の形式になっています。
以下のコードを実行時に、エンコードのエラーが出ます。
現象の意味がまだ分かっていないのですが、
なぜ起きるのでしょうか。
requestに入力する適切な辞書型の書き方は分かりますか。
C:\Users\pcuser\source_code\kensaku_project\flont_sub_jikkouy\app\search\api\apiexecute_test.py
上記で、コマンドから[python apiexecute_test.py]を実行しました。

・apiexecute_test.py import json def service_execute(function_id): request_data = get_request_data() # リクエストデータを取得する def get_request_data(): request_data = get_request_data_body() return request_data def get_request_data_body(): # JSON固定 バイナリ等受け取る場合は処理を分ける request = {"level":3,"parent_address_code":"01#101"} reqdata = request.decode('utf-8') reqdata_dic = json.loads(reqdata) return reqdata_dic if __name__ == "__main__": service_execute(7) ・エラー箇所 reqdata = request.decode('utf-8') AttributeError: 'str' object has no attribute 'decode'

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

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

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

TakaiY

2022/11/11 09:49 編集

このコードではそのエラーにはなりません。 実際に動かしてエラーが発生しているコードを提示してください。
todasan

2022/11/11 10:06

TakaiY さん 実際に動かしているコードを質問に提示しました。
quickquip

2022/11/11 10:11 編集

エラー箇所に書いてある reqdata = request.decode() がコードの中にないので、動かしていると思っているコードと実際に動いているコードが違うのではないでしょうか(つまり勘違い) TakaiY さんの「このコードではそのエラーにはなりません」が正しいでしょう
todasan

2022/11/11 10:36

quickquip さん TakaiY さん 質問を修正しました。 reqdata = request.decode()でも、reqdata = request.decode('utf-8')でも、 エラーになりました。実際に起きたものを質問に修正しました。
TakaiY

2022/11/11 10:40

python apiexecute_test.py を実行した場所が、 C:\Users\pcuser\source_code\kensaku_project\flont_sub_jikkouy\app\search\api フォルダ(ディレクトリ)であることを確認してください。 そうでなければ、違う場所(コマンドを実行している場所)にあるコードを実行してしまっています。 もしくは、 C:\Users\pcuser\source_code\kensaku_project\flont_sub_jikkouy\app\search\api\apiexecute_test.py が提示されたコードではありません。 よく確認してみてください。
TakaiY

2022/11/11 10:43 編集

修正後のものを見ました。それでもやはりおかしいです。 提示のコードであれば、エラーは AttributeError: 'dict' object has no attribute 'decode' となるはずです。 'str' ではありません。
TakaiY

2022/11/11 13:22 編集

コードとエラーが合わない件はおくとして、そもそもそのコードの部分でやろうとしていることは何ですか? 文字列にしても辞書にしてもdecode()メソッドは持っていません。 json文字列を辞書にしたいのではありませんか?
quickquip

2022/11/11 12:08

> reqdata = request.decode()でも、reqdata = request.decode('utf-8')でも、 > エラーになりました。実際に起きたものを質問に修正しました。 reqdata = request.decode() にした時にエラーは変わりましたか? エラーメッセージとコードが合っていないので、変わらなかったのではと思っています。
todasan

2022/11/12 17:08 編集

TakaiY さん quickquip さん json文字列をdecode('utf-8')させる場合、decode('utf-8')させた結果、[{"level":3,"parent_address_code":"01#101"}]のように、変換されるようにしたいです。 エラーメッセージとコードの件は、再度、取り直して、質問を修正します。
TakaiY

2022/11/13 06:46 編集

json文字列 を pythonで扱える辞書にしたいということでしょうか? pythonの辞書をjson文字列にしたいということでしょうか。 しかし、json文字列をdecode() することはできません。 コメントに「バイナリ等受け取る場合」とあり、これがbyte列であった場合、それを、文字列するために、decode() することはあります。 それと混同していませんか?
todasan

2022/11/14 23:52

TakaiY さん 了解しました。ありがとうございます。
guest

回答1

0

ベストアンサー

エスパー回答すると

質問に書いてある=このように動かしていると質問者さんが思っているコード

python

1request = {"level":3,"parent_address_code":"01#101"} 2reqdata = request.decode('utf-8') 3reqdata_dic = json.loads(reqdata)

実際に動いているコード

python

1request = '{"level":3,"parent_address_code":"01#101"}' 2reqdata = request.decode('utf-8') 3reqdata_dic = json.loads(reqdata)

こんな感じになるだろうと想定しているコード

python

1request = b'{"level":3,"parent_address_code":"01#101"}' 2reqdata = request.decode('utf-8') 3reqdata_dic = json.loads(reqdata)

実際にはこう書けば十分なコード

python

1request = b'{"level":3,"parent_address_code":"01#101"}' 2reqdata_dic = json.loads(reqdata)

みたいな感じかなと想像しました。

1つ目は

AttributeError: 'dict' object has no attribute 'decode'

でエラーになります。質問のコードが質問のエラーになりません。

2つ目は

AttributeError: 'str' object has no attribute 'decode'

のエラーになります。

3つ目は
.decode('utf-8')していることからの推測です。

4つ目は
https://docs.python.org/ja/3/library/json.html#json.loads
str, bytes, bytearray のいずれかでいいのでdecodeがそもそも不要です、という説明です。

投稿2022/11/14 23:37

quickquip

総合スコア11373

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.25%

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

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

質問する

関連した質問