HOWTO · Python
Python UnicodeDecodeError: ASCII コーデックは位置のバイトをデコードできません: 序数が範囲外です
この記事では、UnicodeDecodeError の原因と Python での解決策を示します。
このページの内容
この記事では、コードの実行中に発生する UnicodeDecodeError を解決する方法を学びます。 このエラーの原因となるさまざまな理由を見ていきます。
また、Python でこのエラーを解決する方法も見つけます。 Python での UnicodeDecodeError とは何かから始めましょう。
Python での Unicode デコード エラー
UnicodeDecodeError が繰り返し発生し、その理由や解決方法がわからない場合は、この記事をお読みください。
この記事では、このエラーが発生する理由と、それを解決する簡単な方法について詳しく説明します。
Python での Unicode デコード エラーの原因
Python では、ある種類のコーデックを使用して、このコーデックを使用してエンコードされていないバイトをデコードしようとすると、UnicodeDecodeError が発生します。 より具体的に言うと、錠前と鍵の例えを使ってこの問題を理解しましょう。
そのロック専用に作成された一意のキーを使用してのみ開くことができるロックを作成したとします。
このロック用に作られていないキーでこのロックを開こうとするとどうなりますか? それは合わないでしょう。
次の内容でファイル example.txt を作成しましょう。
𝘈Ḇ𝖢𝕯٤ḞԍНǏ
hello world
次のコードを使用して、ascii コーデックを使用してこのファイルをデコードしてみましょう。
例 1:
with open("example.txt", "r", encoding="ascii") as f:
lines = f.readlines()
print(lines)
コードの出力:
Traceback (most recent call last):
File "/home/fatina/PycharmProjects/examples/main.py", line 2, in <module>
lines = f.readlines()
File "/usr/lib/python3.10/encodings/ascii.py", line 26, in decode
return codecs.ascii_decode(input, self.errors)[0]
UnicodeDecodeError: 'ascii' codec can't decode byte 0xf0 in position 0: ordinal not in range(128)
あるコーデックを使用して文字列をエンコードし、別のコーデックを使用してデコードするとどうなるかについて、別のより簡単な例を見てみましょう。
例 2:
string = "𝘈Ḇ𝖢𝕯٤ḞԍНǏ"
encoded_string = string.encode("utf-8")
decoded_string = encoded_string.decode("ascii")
print(decoded_string)
この例では、utf-8 コーデックを使用してエンコードされた文字列があり、次の行では、ascii コーデックを使用してこの文字列をデコードしようとしています。
コードの出力:
Traceback (most recent call last):
File "/home/fatina/PycharmProjects/examples/main.py", line 4, in <module>
decoded_string = encoded_string.decode('ascii')
UnicodeDecodeError: 'ascii' codec can't decode byte 0xf0 in position 0: ordinal not in range(128)
これは、例 1 のファイルの内容と例 2 の文字列が ascii コーデックを使用してエンコードされていないために発生しますが、それを使用してこれらのスクリプトをデコードしようとしました。 これにより、UnicodeDecodeError が発生します。
Python で Unicode デコード エラーを解決する方法
この問題を解決するのはかなり簡単です。 Python のドキュメント を調べると、バイトのデコードに役立ついくつかの標準コーデックが利用できることがわかります。
したがって、上記のコード例で ascii を utf-8 コーデックに置き換えると、example.txt のバイトが正常にデコードされます。
コード例:
with open("example.txt", "r", encoding="utf-8") as f:
lines = f.readlines()
print(lines)
コードの出力:
['𝘈Ḇ𝖢𝕯٤ḞԍНǏ\n', 'hello world']
2 番目の例については、同じことを行うだけで済みます。
コード例:
string = "𝘈Ḇ𝖢𝕯٤ḞԍНǏ"
encoded_string = string.encode("utf-8")
decoded_string = encoded_string.decode("utf-8")
print(decoded_string)
コードの出力:
𝘈Ḇ𝖢𝕯٤ḞԍНǏ
1つのコーデックを使用して文字列を完全にデコードできない場合があることに注意してください。
したがって、必要に応じて、次のように ignore 引数を追加するだけで、デコードできない文字を無視するようにプログラムを開発できます。
with open("example.txt", "r", encoding="utf-8", errors="ignore") as f:
lines = f.readlines()
print(lines)
これにより、一部の文字のデコード中にコンパイラが遭遇するエラーはスキップされますが、これによりデータが失われる可能性があることに注意することが重要です。
この記事が、Python で UnicodeDecodeError を解決する方法を理解するのに役立つことを願っています。