Pythonでバイト列を文字列に変換(decode)
この記事では、Pythonでバイト列を文字列に変換する `decode()` メソッドの使い方を解説します。エンコーディングの指定方法やエラーハンドリングについても説明します。
目次
decode()メソッドの基本
Pythonでバイト列を文字列に変換するには、`decode()` メソッドを使用します。バイト列オブジェクト `.decode(encoding, errors)` にエンコーディングを指定することで、バイト列を対応する文字列に変換できます。`encoding` は文字エンコーディング(例: 'utf-8', 'shift-jis', 'latin-1')を指定します。`errors` はエラー処理方法を指定するオプション引数で、省略した場合は 'strict' が使用され、デコードエラーで例外が発生します。
bytes_data = b'\x61\x62\x63' # バイト列 (abc)
string_data = bytes_data.decode('utf-8')
print(string_data) # 出力: abc
この例では、utf-8 エンコーディングでバイト列 b'\x61\x62\x63' をデコードし、文字列 'abc' に変換しています。
エンコーディングの指定
エンコーディングを正しく指定することが重要です。間違ったエンコーディングを指定すると、文字化けが発生したり、例外が発生したりします。データのエンコーディングが不明な場合は、ファイルのメタデータを確認するか、送信元から確認する必要があります。
bytes_data = b'\x82\xa0\x82\xa2\x82\xb1' # Shift-JISエンコーディングのバイト列
string_data_sjis = bytes_data.decode('shift-jis')
print(string_data_sjis) # 出力: テスト
string_data_utf8 = bytes_data.decode('utf-8', errors='ignore')
print(string_data_utf8) # 出力: エラー処理方法による
Shift-JISでエンコードされたバイト列を正しくデコードするには'shift-jis'を指定します。UTF-8でデコードしようとするとエラーになるため、errors='ignore'でエラーを無視する例も示しました。
エラーハンドリング
`errors` 引数でエラー処理方法を指定できます。主な値は以下の通りです。 - 'strict' (デフォルト): エラー発生時に例外 `UnicodeDecodeError` を発生させる - 'ignore': エラーを無視する - 'replace': エラーを '?' で置き換える - 'xmlcharrefreplace': エラーをXML文字参照で置き換える
bytes_data = b'\x61\x62\x80\x63' # 0x80はUTF-8では不正なバイト
try:
string_data = bytes_data.decode('utf-8')
except UnicodeDecodeError:
print('デコードエラーが発生しました')
string_data = bytes_data.decode('utf-8', errors='replace')
print(string_data) # 出力: ab?c
try-exceptブロックを使用して、`UnicodeDecodeError` 例外をキャッチすることで、エラー発生時の処理を制御できます。
実践例
ファイルからバイト列を読み込んで文字列に変換する例です。
try:
with open('data.txt', 'rb') as f:
bytes_data = f.read()
string_data = bytes_data.decode('utf-8')
print(string_data)
except FileNotFoundError:
print('ファイルが見つかりません')
except UnicodeDecodeError:
print('デコードエラーが発生しました')
ファイルが存在しない場合や、エンコーディングが間違っている場合のエラー処理も追加しています。
関連記事
- Pythonで文字列をバイト列に変換(encode)
- Pythonで文字列をエンコード・デコード(encode, decode)
- Pythonでバイト列を文字列に変換(decode)
- Pythonでファイルのエンコーディングを指定して読み書き
- Pythonで文字列をフォーマット(format, f文字列 (Python 3.6以降), %演算子)
- Pythonで文字列の大文字・小文字を変換(upper, lower, capitalize, title, swapcase)
- Pythonで文字列を置換(replace, translate, re.sub)
- Pythonで文字列を分割(split, rsplit, splitlines)
- Pythonで文字列を検索(find, rfind, index, rindex)
- Pythonで文字列をスライスで部分抽出