Pythonのバイト文字列(bytes)とは?文字列との違いとエンコーディングの基本を解説
Pythonにおける「文字列」と「バイト文字列」の違い
Pythonでは、文字列(str)は文字の並びを表すデータ型です。しかし、文字そのものは抽象的な概念であり、そのままの形でディスクやファイルに保存することはできません。
一方、バイト文字列(bytes)はバイト(0〜255の数値)の並びであり、コンピュータ上で実際に扱える・保存できるデータです。テキストファイルへの書き込みやネットワーク通信など、データを物理的にやり取りする場面では、必ずこのバイト列の形になります。
文字列とバイト列をつなぐ「エンコーディング」
では、抽象的な文字列と具体的なバイト列はどのように結び付けられるのでしょうか。その橋渡し役となるのがエンコーディング(符号化方式)です。
エンコーディングにはUTF-8、UTF-16、Shift_JISなど実に多くの種類があり、理論上は無限に定義可能です。変換を行う際には「どのエンコーディングを使うのか」を正しく把握しておく必要があります。なぜなら、同じバイト列でも、適用するエンコーディングが異なれば、まったく別の文字列として解釈されることがあるからです。
同じバイト列が異なる文字列になる例
実際に、同一のバイト列を異なるエンコーディングでデコードすると、結果がどう変わるかを見てみましょう。
>>> b'\xcf\x84o\xcf\x81\xce\xbdo\xcf\x82'.decode('utf-16')
'蓏
'蓏콯캁澽苏'
>>> b'\xcf\x84o\xcf\x81\xce\xbdo\xcf\x82'.decode('utf-8')
'τoρνoς'このように、まったく同じバイト列でも、utf-16で解釈すれば意味不明な文字の羅列になり、utf-8で解釈すればギリシャ語の「τορνος」という意味のある文字列になります。これは、エンコーディングの指定を間違えるとデータが壊れて見える(いわゆる「文字化け」)理由を示す好例です。
decode()メソッドとencode()メソッドの使い方
正しいエンコーディングさえ分かれば、変換は非常にシンプルです。
- bytes.decode(エンコーディング名):バイト列 → 文字列 への変換(デコード)
- str.encode(エンコーディング名):文字列 → バイト列 への変換(エンコード)
つまり、バイト文字列に対して.decode()メソッドを呼び出せば、そこから正しい文字列を取り出せます。逆に、文字列に対して.encode()メソッドを呼び出せば、文字列をバイト列へと変換できます。
使用例
>>> text = 'こんにちは'
>>> b = text.encode('utf-8') # 文字列 → バイト列
>>> b
b'\xe3\x81\x93\xe3\x82\x93\xe3\x81\xab\xe3\x81\xa1\xe3\x81\xaf'
>>> b.decode('utf-8') # バイト列 → 文字列
'こんにちは'まとめ
- 文字列(str)は抽象的な概念で、そのまま保存できない
- バイト文字列(bytes)は実際にディスクへ保存できるデータ
- 両者を変換するのがエンコーディングであり、指定を誤ると文字化けが発生する
- バイト列→文字列は
decode()、文字列→バイト列はencode()を使う
Pythonでファイル入出力やネットワーク処理を扱う際には、「今扱っているのは文字列か、それともバイト列か」「どのエンコーディングを使うべきか」を常に意識することが、文字化けなどのトラブルを防ぐ鍵となります。
-
Python文字列の最大長はどれくらい?メモリと環境による上限を解説
Python文字列の最大長は環境によって決まるPythonにおける文字列の最大長は、理論上の上限よりも、実際に利用できるメモリ容量とPythonの実行環境(32ビットか64ビットか)によって決まります。言語仕様上、文字列の長さは Py_ssize_t 型で管理されており、64ビット環境では最大約9.2×1018(263-1)文字まで扱えることになっています。しかし、現実的にはこの上限に達する前にメモリが足りなくなります。64ビット環境の場合64ビット版のPythonを搭載し、64GBのメモリを備えたマシンであれば、約63GB程度の巨大な文字列でも十分に扱うことが可能です。さらにメモリを増設すれ
-
Pythonの文字列(str)とバイト文字列(bytes)の違いをわかりやすく解説
文字列とバイト文字列の基本的な違いPythonにおける文字列(str)は「文字」の並びであり、これは抽象的な概念です。そのため、そのままではディスクに保存することができません。一方、バイト文字列(bytes)は「バイト」の並びであり、実際にディスクへ保存できるデータです。この両者をつなぐのがエンコーディング(符号化方式)です。エンコーディングには非常に多くの種類があり(理論上は無限に存在します)、変換を行う際にはどのエンコーディングが使われているのかを正しく把握しておく必要があります。なぜエンコーディングの指定が重要なのか同じバイト列でも、解釈するエンコーディングが異なれば、まったく別の文字列