Python UnicodeDecodeError: ASCII コーデックは位置のバイトをデコードできません: 序数が範囲外です
この記事では、コードの実行中に発生する 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
を解決する方法を理解するのに役立つことを願っています。
My name is Abid Ullah, and I am a software engineer. I love writing articles on programming, and my favorite topics are Python, PHP, JavaScript, and Linux. I tend to provide solutions to people in programming problems through my articles. I believe that I can bring a lot to you with my skills, experience, and qualification in technical writing.
LinkedIn関連記事 - Python Error
- AttributeError の解決: 'list' オブジェクト属性 'append' は読み取り専用です
- AttributeError の解決: Python で 'Nonetype' オブジェクトに属性 'Group' がありません
- AttributeError: 'generator' オブジェクトに Python の 'next' 属性がありません
- AttributeError: 'numpy.ndarray' オブジェクトに Python の 'Append' 属性がありません
- AttributeError: Int オブジェクトに属性がありません
- AttributeError: Python で 'Dict' オブジェクトに属性 'Append' がありません