Python3中編碼與解碼之Unicode與bytes的講解
今天玩Python爬蟲,下載一個網頁,然后把所有內容寫入一個txt文件中,出現(xiàn)錯誤;
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)。但是這樣就出現(xiàn)了兼容性的問題,所以就有了Unicode,也就是所謂的萬國碼,python3中字符串類型str就是以Unicode編碼格式編碼,所以我們在Python3 中看到多種語言文字的字符串而不會出現(xiàn)亂碼。
編碼是一種用一種特定的方式對抽象字符(Unicode)轉換為二進制形式(bytes)進行表示,也就是python3中的encode。解碼就是對用特定方式表示的二進制數(shù)據用特定的方式轉化為Unicode,也就是decode。
下圖就是編碼的核心:
一、字符的編碼:
Python對于bites類型的數(shù)據用帶‘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類型。文章開頭出現(xiàn)的集中錯誤,就是因為寫入模式與寫入內容的數(shù)據類型不匹配造成的。
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參數(shù) with open('F:\\2.txt','wb') as f2: f2.write(s2)
有的人會問,我在系統(tǒng)里面用文本編輯器打開以bytes形式寫入的2.txt文件,發(fā)現(xiàn)里面顯示的是‘你好’,而不是‘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('http://www.dbjr.com.cn/article/157034.htm ' ,timeout=5 ) #此處以UTF-8方式進行解碼,解碼后的數(shù)據以unicode的方式存儲在html中 html = response.read().decode('UTF-8') print(type(html))#輸出結果:<class 'str'> #這時寫入方式一定要加encoding,以encoding # 即UTF-8的方式對二進制數(shù)據進行編碼才能寫入 with open('F:\DownloadAppData\html.txt',"w" , encoding='UTF-8') as f: f.write(html)
以‘wb’方式寫入:
response= url_open('http://www.dbjr.com.cn/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。
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。如果你想了解更多相關內容請查看下面相關鏈接
相關文章
python 判斷參數(shù)為Nonetype類型或空的實例
今天小編就為大家分享一篇python 判斷參數(shù)為Nonetype類型或空的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-10-10python3通過selenium爬蟲獲取到dj商品的實例代碼
這篇文章主要介紹了python3通過selenium爬蟲獲取到dj商品的實例代碼,需要的朋友可以參考下2019-04-04opencv python 圖片讀取與顯示圖片窗口未響應問題的解決
這篇文章主要介紹了opencv python 圖片讀取與顯示圖片窗口未響應問題的解決,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-04-04合并Excel工作薄中成績表的VBA代碼,非常適合教育一線的朋友
每次學生考試,評分完畢之后,把每個科的成績收集起來,就得到了一個有若干工作表,每個表有學生學號、分數(shù)等列的Excel工作薄。2009-04-04python使用HTMLTestRunner導出餅圖分析報告的方法
這篇文章主要介紹了python使用HTMLTestRunner導出餅圖分析報告的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-12-1215款Python編輯器的優(yōu)缺點,別再問我“選什么編輯器”啦
這篇文章主要介紹了15款Python編輯器的優(yōu)缺點,別再問我“選什么編輯器”啦,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2020-10-10Python實現(xiàn)的微信好友數(shù)據分析功能示例
這篇文章主要介紹了Python實現(xiàn)的微信好友數(shù)據分析功能,結合實例形式分析了Python使用itchat、pandas、pyecharts等模塊針對微信好友數(shù)據進行統(tǒng)計與計算相關操作技巧,需要的朋友可以參考下2018-06-06