国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

Python3中編碼與解碼之Unicode與bytes的講解

2020-02-16 01:25:55
字體:
來源:轉載
供稿:網友

今天玩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,然后才給你看到。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 黄梅县| 原阳县| 崇礼县| 连州市| SHOW| 福建省| 甘孜县| 措勤县| 佛教| 松桃| 东平县| 沙湾县| 泾源县| 枣庄市| 珲春市| 新乡县| 东乡族自治县| 仁化县| 沧州市| 思茅市| 基隆市| 铁岭市| 渭源县| 临湘市| 崇州市| 万山特区| 龙南县| 丁青县| 洛隆县| 玛沁县| 宝丰县| 梅州市| 三台县| 高台县| 景泰县| 定远县| 志丹县| 汪清县| 馆陶县| 天全县| 四子王旗|