kumitatepazuru's blog

中学生のメモブログ。みんなの役に立ちたい。

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のソースコードはこれ。

github.com

えっと、これは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追記 公開しました。

pypi.org

最後に

pythonやっぱ便利。


個人的な質問等はこちらまで。

https://forms.gle/V6NRhoTooFw15hJdA

また、自分が参加しているRobocup soccer シミュレーションリーグのチームでは参加者募集中です!活動の見学、活動に参加したい方、ご連絡お待ちしております!

詳しくはこちら

kumitatepazuru.github.io