PYTHON MEBY

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('デコードエラーが発生しました')

ファイルが存在しない場合や、エンコーディングが間違っている場合のエラー処理も追加しています。

関連記事