ある記事では、Python ファイル読み取りエラー UnicodeDecodeError: 'gbk' コーデックがバイトをデコードできないことを理解しています

問題の説明:

ファイルの内容を読み取って出力する非常に簡単な例を次に示します。

with open('test.txt', 'r') as f:
    contents = f.read()

print(contents)

test.txt テキスト ファイルには、「you」という単語が 1 つだけあります。

テスト.txt

ただし、このコードを実行すると、次のエラーが発生します。

エラー:

UnicodeDecodeError: 'gbk' codec can't decode byte 0xa0 in position 2: incomplete multibyte sequence

問題を分析します:

  1. まず第一に、このエラーが何を意味するのかを知る必要があります。

エラーレポートの翻訳は次のとおりです。

Unicode デコード エラー: 「gbk」コーデックは位置 2 のバイト 0xa0 をデコードできません: 不完全なマルチバイト シーケンス

  1. エラー メッセージを理解すると、これがデコード エラーであることがわかります。このエラーを分析するには、まず Python の文字エンコーディングの基本を理解する必要があります。

Python 文字エンコーディングの問題については、私のブログ投稿を参照してください。

Pythonの文字エンコードがわかる一記事(エンコード方法、文字化け、エラーの原因) - プログラマーが求めた

このブログ投稿では、文字エンコーディングを紹介するだけでなく、このエラーの具体的な原因も分析しましたが、ここでは主に解決策について説明するので、詳細は説明しません。詳細については、この記事のセクション 3 および 4 を参照してください。

  1. このエラーは、gbk (Windows プラットフォーム、デフォルトのエンコードは gbk) を使用してテキストをデコードするときに、デコードできない余分なバイトが存在することが原因であることがわかりました。gbk は中国語の文字を 2 バイトにエンコードします。つまり、2 バイトごとに中国語の文字にデコードできますが、1 バイトはデコードできないため、エラーが報告され、次のエラー メッセージの説明も表示されます。 不完全なマルチバイト シーケンス (不完全なマルチバイトシーケンス)。

  1. この種の問題は、通常、テキスト ファイルが utf-8 でエンコードされている ( utf-8 は中国語の文字を 3 バイトにエンコードする) ために発生しますが、デコードには gbk を使用します。漢字は両者のエンコード方式が異なるため、デコード時にデコードできない余分なバイトが発生してエラーが発生します。

デコード不可能な余分なバイトがあると表示されるのはなぜですか?

エラーが報告されない特別な状況があるためです。utf-8 では漢字 2 文字(6 バイト)がエンコードされていますが、このとき gbk を使用すると 3 つの漢字(6 バイトを 3 つの部分と 2 バイトに分けて3 つの漢字に対応できます)にデコードできます。この場合、エラーは報告されませんが、表示される情報が異なる、いわゆる文字化けです。詳細については、上記のブログ投稿を参照してください。

読み込んだ test.txt ファイルの内容を、漢字 2 文字の「Hi Hao」に変更できます。このコードを実行すると、エラーは発生しませんが、出力される情報は「Hi Hao」ではないことがわかります。

5. この問題を解決するには、Python で utf-8 を使用してファイルをデコードできるようにする必要があります。

解決:

open() を使用する場合は、パラメータ encoding='utf-8' を追加します。このパラメータを使用することは、Python に「ファイルは utf-8 でエンコードされています。後でこのファイルをデコードするときは、gbk ではなく utf-8 を使用してください」と伝えることと同じです。

with open('test.txt', 'r', encoding='utf-8') as f:
    contents = f.read()

print(contents)

出力:

成功!問題が解決しました。

おすすめ

転載: blog.csdn.net/lyb06/article/details/129675526