91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python3中編碼與解碼之Unicode與bytes的示例分析

發布時間:2021-08-26 10:40:42 來源:億速云 閱讀:119 作者:小新 欄目:開發技術

這篇文章將為大家詳細講解有關Python3中編碼與解碼之Unicode與bytes的示例分析,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

Python爬蟲,下載一個網頁,然后把所有內容寫入一個txt文件中,出現錯誤;

TypeError: write() argument must be str, not bytes
AttributeError: 'URLError' object has no attribute 'code'
UnicodeEncodeError: 'gbk' codec can't encode character '\xa0' inposition 5747: illegal multibyte sequence

一看就是編碼問題,不懂,度娘上面這方面講得不多,感覺沒說清楚,自己研究了一晚上,摸出了一點門道。

從頭說起,由于各國語言文字不同,起初要在計算機中表示,就有了各種各樣的編碼(例如中文的gb2312)。但是這樣就出現了兼容性的問題,所以就有了Unicode,也就是所謂的萬國碼,python3中字符串類型str就是以Unicode編碼格式編碼,所以我們在Python3 中看到多種語言文字的字符串而不會出現亂碼。

編碼是一種用一種特定的方式對抽象字符(Unicode)轉換為二進制形式(bytes)進行表示,也就是python3中的encode。解碼就是對用特定方式表示的二進制數據用特定的方式轉化為Unicode,也就是decode。

下圖就是編碼的核心:

一、字符的編碼:

Python對于bites類型的數據用帶‘b‘前綴的單引號活雙引號表示。

下面關于字符編碼解碼的代碼很好的解釋了上面的流程圖:

s='你好'
print(s)#輸出結果:你好
print(type(s))#輸出結果:<class 'str'>
s=s.encode('UTF-8')
print(s)#輸出結果:b'\xe4\xbd\xa0\xe5\xa5\xbd'
print(type(s))#輸出結果:<class 'bytes'>
s=s.decode('UTF-8')
print(s)#輸出結果:你好
print(type(s))#輸出結果:<class 'str'>

多說一句,如果你對str類型字符進行decode會報錯,同理,對bytes類型進行encode也會報錯。

二、文件編碼

在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'\xe4\xbd\xa0\xe5\xa5\xbd'',因為文本文檔打開2.txt時,又會對它進行decode,然后才給你看到。

三、網頁的編碼

網頁編碼和文件編碼方法差不多,如下urlopen下載下來的網頁read()且用decoding(‘utf-8')解碼,那就必須以‘w'的方式寫入文件。如果只是read()而不用encoding(‘utf-8')進行編碼,一定要以‘wb'方式寫入:

以‘w'方式寫入時:

response= url_open('https://www.jb51.net/article/157034.htm ' ,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('https://www.jb51.net/article/157034.htm ' ,timeout=5 )
html = response.read()#此處不需要進行解碼,下載下來
print(type(html))#輸出結果:<class 'bytes'>
with open('F:\DownloadAppData\html.txt',"wb" ) as f:
  f.write(html)

如果要在Python3中,對urlopen下來的網頁進行字符搜索,肯定也要進行decode,例如使用lxml.etree就必須進行decode。

關于“Python3中編碼與解碼之Unicode與bytes的示例分析”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

朝阳市| 涿州市| 垫江县| 河北区| 乌兰察布市| 志丹县| 邢台市| 宝坻区| 肇庆市| 大丰市| 姜堰市| 东港市| 子洲县| 兖州市| 顺昌县| 通州区| 平度市| 安吉县| 雷州市| 搜索| 汝州市| 五家渠市| 凤冈县| 方正县| 深圳市| 罗江县| 阿克苏市| 黄浦区| 定陶县| 宣恩县| 钦州市| 吉木萨尔县| 海盐县| 宝丰县| 连云港市| 盐边县| 乐陵市| 宁海县| 望奎县| 邳州市| 阿克苏市|