Python: bytes 型 と str 型の違い。変換方法

TwitterFacebookHatena
  • 公開:2021-12-06
  • 更新:2023-10-26
  • 文章量:1482
  • Python

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 の文字列とバイト列の取り扱いは独特な部分もあるので、使い分けや変換方法を理解しておくと便利である。

Python: bytes 型 と str 型の違い。変換方法