Pythonのコード問題(encodingとdecode、strとbytes)を詳しく説明します。


1引用
文書の読み書きや文字操作においては、次のようなエラーがよく発生します。
  • Type Error:write()argment must be str,not bytes
  • AttributeError:'URLError'object hasのatribute'code'
  • Unicode EncodeError:'gbk'codec can't encode character'\xa 0'inposition 5747:illegal multi byte sequence
  • これらのエラーはエンコーディングの問題です。Python 3ファイルの読み書きと文字操作におけるエンコーディングをまとめます。
    2コード開発史
    (1)ASCIIコード
    コンピュータは0と1しか処理できません。どのシンボルも0と1のシーケンスに変換して処理できます。コンピュータの8ビット(bit)は1バイトとしているので、1バイトは2の8乗個の0と1の異なる組み合わせ、つまり1バイトの多さは256種の文字を表すことができます。ASCIIコードは1バイトで文字を格納します。コンピュータは最初はアメリカ人が発明したものです。彼らの記号は多くないので、8つの0と1シーケンスの中の1位を0に固定しています。ASCIIは127文字しか表現できません。
    (2)GB 2312符号化
    ヤンキーの記号は多くないので、ASCIIコードは十分ですが、他の国ではだめです。国によって記号の数が違います。それぞれ自分のコードを指定しました。例えば私達の中国はGB 2312コードを制定しました。GB 2312符号化は、1文字を2バイトで表す。
    (3)ユニックコード
    国ごとに自分のコードを使うと、コードは一輪でまとまりやすく、コミュニケーションもできないので、一つのコードが必要です。だからユニックは万国コードとも呼ばれています。Unicodeコードも1文字を2バイトで記憶します。
    (4)utf-8符号化
    Unicodeコードは符号化が通用しない問題を解決しましたが、メモリを浪費しやすく、特に英語を記憶する時、例えば1文字の「A」、ASCIIコードは1バイトだけで十分です。この問題を解決するために、utf-8コードがあります。utf-8コードは英語を記憶しても同じバイトを使います。漢字は3バイトです。特に、慣れないプログラミング4-6バイトは、大量の英語を転送すると、utf-8の役割が明らかになります。
    utf-8コードは保存する時に大きな利点がありますが、コンピュータメモリを読み込む時にはあまり適していません。utf-8コードは長くなりますので、アドレス指定やインデックスが不便です。コンピュータメモリでは、やはりUniodeコードに変換するのが適当です。これは、テキストを読むたびに、コードをUnicodeコードに変換し、メモリの文字をファイルに書き込むときに、コードをutf-8に変換する理由を説明することができます。
    3 strとbytes
    Python 3では、テキストは常にUnicodeコードであり、タイプ的にはstrクラスであり、つまりPythonコンパイラはUnicodeコード下のバイナリストリームのみを識別可能なシンボルとして表示します。バイナリストリームはPythonにもこのようなバイナリシーケンスを表すための専用のクラスがあります。それはbytesです。一つのstrは異なる符号化で異なるbytes(バイナリストリーム)に変換できます。逆に、bytesを識別可能なstrに変換するには対応するコードを使わなければなりません。そうでなければエラーが発生します。
    人類の言語で類比してみます。私たちは「食事」というものを表現します。各国の文字に訳してそれぞれの表現があります。中国語は「食事」、英語は「eat」と表しています。これは「食事」というstrが異なった符号で書かれているということです。しかし、公式は中国語しか知らないので、「eat」を英語で表記して中国語の「食事」に変えなければなりません。公式は食事ということを知っています。
    
    >>> s = '  '
    >>> type(s)
    <class 'str'>
    >>> s1 = s.encode(encoding='utf-8')
    >>> type(s1)
    <class 'bytes'>
    >>> s1
    b'\xe5\x90\x83\xe9\xa5\xad'
    >>> s2 = s.encode(encoding='gb2312')
    >>> type(s2)
    <class 'bytes'> 
    >>> s2
    b'\xb3\xd4\xb7\xb9'
    >>> s1.decode('utf-8')
    '  '
    >>> s2.decode('gb2312')
    '  '

    4ファイルコード
    python 3では、文字はUnicodeとして記憶されていますが、ここでいう記憶とはコンピュータメモリに記憶されています。もしハードディスクに記憶されているなら、Python 3の文字はbytesとして記憶されています。つまり、文字をハードディスクに書き込むなら、文字をencodeにしなければなりません。上の文に対してもう一度説明してください。もしstrをファイルに書き込むなら、「w」モードで書き込むなら、書き込むべき内容はstrタイプでなければなりません。「wb」で書き込むなら、書き込みを要求する内容はbytesタイプでなければなりません。文章の先頭にあるいくつかのエラーは、書き込みモードと書き込みデータタイプが一致しないためです。
    
    s1 = '  '
    #    ‘w'     ,        encoding,      
    with open('F:\\1.txt','w',encoding='utf-8') as f1:
     f1.write(s1)
    s2 = s1.encode("utf-8")#   bytes   
    #           ‘wb',      encoding  
    with open('F:\\2.txt','wb') as f2:
     f2.write(s2)
    ある人が聞きますが、私はシステムの中でテキストエディタでbytes形式で書かれた2.txtファイルを開けてみました。中には「こんにちは」と表示されています。「b'\xe 4\xbd\xa 0\xe 5\xbd'」ではなく、文書ドキュメントが2.txtを開くと、システムは適切なコードでそれを対応する記号として表示しています。
    5ページコード
    ホームページのエンコーディングとファイルのエンコーディング方法は同じです。urlopenからダウンロードしたウェブページのread()をデコードし、decoding(「utf-8」)で復号するなら、「w」の形でファイルに書き込む必要があります。read()だけでencoding(‘utf-8’)を使わずに符号化するなら、必ず‘wb’で記入します。
    ‘w’で書き込む場合:
    
    response= url_open('http://blog.csdn.net/gs_zhaoyang/article/details/13768925 ' ,timeout=5 )#            
    #   UTF-8      ,       unicode      html 
    html = response.read().decode('UTF-8')
    print(type(html))#    :<class 'str'>
    #          encoding, encoding
    #  UTF-8                 
    with open('F:\DownloadAppData\html.txt',"w" , encoding='UTF-8') as f:
     f.write(html)
    「wb」で書き込み:
    
    response= url_open('http://blog.csdn.net/gs_zhaoyang/article/details/13768925 ' ,timeout=5 )
    html = response.read()#         ,    
    print(type(html))#    :<class 'bytes'>
    with open('F:\DownloadAppData\html.txt',"wb" ) as f:
     f.write(html)
    Python 3でurlopenがダウンロードしたウェブページに対して文字操作(例えば、正規のマッチング、lxml抽出)を行うには、decodeがUnicoodeになる必要があります。
    作者:オダオ
    マイクロ信号:chb 1137796095
    Github:https://github.com/ChenHuabin321
    V交流、共同学習、共同進歩を歓迎します。
    以上はPythonのコード問題(encodingとdecode、strとbytes)の詳細を詳しく説明しました。pythonコードに関する資料は他の関連記事に注目してください。