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」を英語で表記して中国語の「食事」に変えなければなりません。公式は食事ということを知っています。
4ファイルコード
python 3では、文字はUnicodeとして記憶されていますが、ここでいう記憶とはコンピュータメモリに記憶されています。もしハードディスクに記憶されているなら、Python 3の文字はbytesとして記憶されています。つまり、文字をハードディスクに書き込むなら、文字をencodeにしなければなりません。上の文に対してもう一度説明してください。もしstrをファイルに書き込むなら、「w」モードで書き込むなら、書き込むべき内容はstrタイプでなければなりません。「wb」で書き込むなら、書き込みを要求する内容はbytesタイプでなければなりません。文章の先頭にあるいくつかのエラーは、書き込みモードと書き込みデータタイプが一致しないためです。
5ページコード
ホームページのエンコーディングとファイルのエンコーディング方法は同じです。urlopenからダウンロードしたウェブページのread()をデコードし、decoding(「utf-8」)で復号するなら、「w」の形でファイルに書き込む必要があります。read()だけでencoding(‘utf-8’)を使わずに符号化するなら、必ず‘wb’で記入します。
‘w’で書き込む場合:
作者:オダオ
マイクロ信号:chb 1137796095
Github:https://github.com/ChenHuabin321
V交流、共同学習、共同進歩を歓迎します。
以上はPythonのコード問題(encodingとdecode、strとbytes)の詳細を詳しく説明しました。pythonコードに関する資料は他の関連記事に注目してください。
文書の読み書きや文字操作においては、次のようなエラーがよく発生します。
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コードに関する資料は他の関連記事に注目してください。