Pythonの文字列の扱いについて


Pythonでの文字列

Pythonでは文字列にstr型とbyte型があります。
この違いを知っておかないと下記のようなエラーに遭遇することになるので、ひらがなや漢字などの文字列を扱う場合は注意が必要です。
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)


str型

Unicodeで扱われる文字列です。
>>> print(type("piyopiyo"))
<class 'str'>
byte型に変換したいときはencode()を使います。
>>> print("puyopiyo".encode("UTF-8"))
b'puyopiyo'
>>> print(type("puyopiyo".encode("UTF-8")))
<class 'bytes'>


byte型

ASCIIで扱われる文字列です。
文字列の前にbを付けるとbyte型になります。
>>> print(type(b"piyopiyo"))
<class 'bytes'>
str型に変換したいときはdecode()を使います。
>>> print(b"piyopiyo".decode("UTF-8"))
piyopiyo
>>> print(type(b"piyopiyo".decode("UTF-8")))
<class 'str'>


ファイル操作時

下記に注意をする必要があります。
  • ファイルを読込時はbyte型をstr型に変換する
  • ファイル書込時はstr型をbyte型に変換する


まとめ

文字列を結合するときに、str型とbyte型が混同しているとUnicodeEncodeErrorになるので、エラーメッセージ等の実装には注意が必要です。
必ず文字コードを意識した実装をしましょう。