TL;DR
Python 3 では、文字列データを表すのに bytes と str がある。bytes のインスタンスは符号なし 8 ビット値で構成され、ASCII(文字コードの標準規格) エンコーディングで表示される。str は Unicode コードポイントの文字列を含む。
bytes 型 と str 型 のポイント
- str と bytes は同時に扱えない
- ファイルにバイナリデータを書き込む場合、バイナリモードでオープンしなければならない
- bytes は 8 ビットの値の列を含む
- str は Unicode コードポイントの文字列を含む
バイナリデータについて
データ形式を大別すると、テキストとバイナリに分類される。バイナリデータとは、文字・画像・音楽・動画などテキストデータ以外のデータ。人が見ても意味が不明瞭なデータである。
バイナリデータを操作するためのものは 2 つある。
- bytes:イミュータブル(変更不可)。バイトのタプルのようなもの
- bytearray:ミュータブル(変更可)。バイトのリストのようなもの
組み込み型 — Python 3.10.0b2 ドキュメント
bytes 型
bytes 型はコンピューターにとって扱いやすいバイト配列を扱う。バイトの不変なシーケンス(複数の要素を順番に並べたデータ型)である。str 型は人が読み書きしやすいが、bytes 型はコンピューターにとって扱いやすい。ハードディスクに直接保存可能である。
b の後で、クォートで囲むとバイト型になる。次のコードでは、encode() を使い文字列をエンコードしている。
# str を bytes に変換する
s = 'café'
print(type(s))
b = s.encode('utf8')
print(b)
print(type(b))
# bytes を str に変換する
bb = b'd\xc3\xa9j\xc3\xa0 vu'
s = bb.decode('utf8')
print(s)
print(type(s))
str 型
str 型は文字列を扱う。str は Unicode コードポイントの不変なシーケンスである。人間が読み書きしやすい形式にするため、エンコード (str -> bytes) とデコード (bytes -> str) を行う。
bytes と str の変換
Python では、文字列をバイト列に変換するには str オブジェクトの encode メソッドを使用し、逆にバイト列を文字列に変換するには bytes オブジェクトの decode メソッドを使用する。
encode メソッド
encode メソッドを使うと、str を bytes に変換できる。エンコードには様々な方式があるが、一般的によく使われるのは UTF-8 である。
# str を bytes に変換する
s = 'café'
b = s.encode('utf8')
print(b)
decode メソッド
decode メソッドを使うと、bytes を str に変換できる。エンコードした方式と同じ方式を指定する。
# bytes を str に変換する
bb = b'd\xc3\xa9j\xc3\xa0 vu'
s = bb.decode('utf8')
print(s)
Python の文字列とバイト列の取り扱いは独特な部分もあるので、使い分けや変換方法を理解しておくと便利である。