pythonでバイナリから文字列に変換するときに変換できない文字があった時にエラーを出さないようにする。
pythonでバイナリから文字列に変換するときに変換できない文字があった時にエラーを出さないようにすることがちょっとわからなかったのでメモ。
経緯
cszpのバグが少なくなって一段落したところにまた次のエラーが。
CSZP PROGRAM ERROR cszp=4.5.1.7 ---------- error log ---------- Traceback (most recent call last): File "/home/mm/.pyenv/versions/anaconda3-4.4.0/envs/cszp/lib/python3.6/site-packages/cszp/__init__.py", line 131, in main cszp_menu.menu(lang, module, Input) File "/home/mm/.pyenv/versions/anaconda3-4.4.0/envs/cszp/lib/python3.6/site-packages/cszp/cszp_menu.py", line 100, in menu cszp_soccer.setting(lang, loopmode=True, module=module, Input=Input) File "/home/mm/.pyenv/versions/anaconda3-4.4.0/envs/cszp/lib/python3.6/site-packages/cszp/cszp_soccer.py", line 632, in setting soccer([team2, team1, arg], lang, loop, module, [server, player, csv_q, synch], Input) File "/home/mm/.pyenv/versions/anaconda3-4.4.0/envs/cszp/lib/python3.6/site-packages/cszp/cszp_soccer.py", line 190, in __init__ stdout = stdout.decode("utf-8") UnicodeDecodeError: 'utf-8' codec can't decode bytes in position 19003-19004: invalid continuation byte
一応cszpのソースコードはこれ。
えっと、これはsubprocessで返ってきたバイナリを文字列に変換するところでエラーかな? てことはこれは相手側のエラーだけど一応こっちも今後のために対策しようかな。 変換時に変換できない文字があったときに?とかに変えればいいんじゃない? うん。そうしよう。
やってみる
調べたら、あった。
エンコードの指定方法、エラーが起こったときの対処方法は、encode()と同じ文字列を使います。
みんなのpython 4th
ってことはencodeと同じということね。encodeを見てみると
encode(エンコード名,エラー処理の方法)
あった。「エラー処理の方法」これだ。 見てみると、ここには指定の文字列を入れるそう。文字列は以下の通り。
文字列 | 説明 |
---|---|
strict | エラーが起こった場合にエラー(例外)を発生して変換を停止します。オプションを指定しない場合のデフォルトのふるまいとしても利用されます。 |
replace | エンコード変換できない文字があると「?」などの適切な文字列に置き換えて返します。エンコード時にエラーが起こっても変換を継続します。 |
ignore | エンコード変換でエラーが起こった場合、そのまま変換を継続します。エラーで変換できなかった文字列は取り除かれます。 |
出典:上記に記載 replace。これだ。テストをしてみる。
In [1]: open("文章.odt","rb").read().decode("utf-8") --------------------------------------------------------------------------- UnicodeDecodeError Traceback (most recent call last) <ipython-input-1-55161795db17> in <module> ----> 1 open("文章.odt","rb").read().decode("utf-8") UnicodeDecodeError: 'utf-8' codec can't decode byte 0xd7 in position 10: invalid continuation byte In [2]: open("文章.odt","rb").read().decode("utf-8","replace") Out[2]: 'PK\x03\x04\x14\x00\x00\x08\x00\x00�\x03�P^�2\x0c\... In [3]:
しっかりと変換できている。これをあとでcszpに組み込んであげる。このバグ修正版はcszp ver4.5.1.8で公開予定。06/03追記 公開しました。
最後に
pythonやっぱ便利。
個人的な質問等はこちらまで。
https://forms.gle/V6NRhoTooFw15hJdA
また、自分が参加しているRobocup soccer シミュレーションリーグのチームでは参加者募集中です!活動の見学、活動に参加したい方、ご連絡お待ちしております!
詳しくはこちら