日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

詳解Python中的編碼問題(encoding與decode、str與bytes)

瀏覽:35日期:2022-07-09 13:46:00
1 引言

在文件讀寫及字符操作時,我們經(jīng)常會出現(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

這些錯誤一看就是編碼問題, 本篇博文總結(jié)一下Python3文件讀寫及字符操作中的編碼。

2 編碼發(fā)展史

(1)ASCII編碼

眾所周知,計算機只能處理0和1,任何符號都轉(zhuǎn)換為0和1的序列才能處理。計算機中8個位(bit)作為一個字節(jié),所以1個字節(jié)能產(chǎn)生2的8次方個0和1的不同組合,也就是說1個字節(jié)做多能表示256種字符。ASCII編碼就是用1個字節(jié)來存儲字符,計算機最初是美國人發(fā)明的,他們的符號不多,所以還將8個0和1序列中的第一位固定為0,ASCII只能表示127個字符。

(2)GB2312編碼

美國佬的符號不多,所以ASCII編碼夠用,但是其他國家就不行了,每個國家符號數(shù)量都不一樣,就各自指定了自己的編碼。例如我們中國就制定了GB2312編碼。GB2312編碼用2個字節(jié)表示一個字符。

(3)Unicode編碼

每個國家都用自己的編碼,編碼一朵就容易亂套,也沒法交流,所以需要一種編碼把各個國家的編碼都囊括進去,這就是Unicode編碼的由來。所以,Unicode也被稱為萬國碼。Unicode編碼也用2個字節(jié)存儲一個字符。

(4)utf-8編碼

Unicode編碼解決了編碼不能通用的問題,但是卻容易浪費內(nèi)存,尤其是在存儲英文的時候,例如一個字符“A”,ASCII編碼只需要1個字節(jié)就夠,但是Unicode編碼必須要用2個字節(jié)。為了解決這一問題,就有了utf-8編碼。 utf-8編碼把存儲英文依舊用一個字節(jié),漢字就3個字節(jié)。特別是生僻的編程4-6字節(jié),如果傳輸大量英文,utf-8作用就很明顯了。utf-8編碼進行存儲時有極大地優(yōu)勢,但是當讀取到計算機內(nèi)存時卻不大合適,因為utf-8編碼是變長的,不方便尋址和索引,所以在計算機內(nèi)存中,還是轉(zhuǎn)化為Unicode編碼合適些。這就可以解釋為什么每次讀取文本時,要將編碼轉(zhuǎn)化為Unicode編碼,而將內(nèi)存中的字符寫入文件存儲時,要將編碼轉(zhuǎn)化為utf-8了。

3 str與bytes

在Python3中,文本總是為Unicode編碼,在類型上為str類,也就是說Python編譯器只會把Unicode編碼下的二進制流顯示為我們可識別的符號。二進制流在Python中也有一個專門的類用于表示這種二進制序列,那就是bytes(在Python中這個二進制序列顯示為16進制,但本質(zhì)還是二進制)。一個str在不同的編碼下就可以轉(zhuǎn)化為不同的bytes(二進制流),反之,要將bytes轉(zhuǎn)化為可識別的str就必須用對應的編碼,否則就會報錯。

用人類語言類比一下:我們要表達“吃飯”這件事物(str),翻譯為各個國家的文字后有各不相同的表示,中文表示為“吃飯”,英文表示為“eat”,這就是“吃飯”這個str在不同編碼寫的表示。但官方只認中文(Pythonstr只認Unicode編碼),所以就必須把“eat”用英語(編碼)的表示方式轉(zhuǎn)化為中文的“吃飯”(Unicode編碼),官方才會顯示知道是吃飯這件事。

>>> s = ’吃飯’>>> type(s)<class ’str’>>>> s1 = s.encode(encoding=’utf-8’)>>> type(s1)<class ’bytes’>>>> s1b’xe5x90x83xe9xa5xad’>>> s2 = s.encode(encoding=’gb2312’)>>> type(s2)<class ’bytes’> >>> s2b’xb3xd4xb7xb9’>>> s1.decode(’utf-8’)’吃飯’>>> s2.decode(’gb2312’)’吃飯’

詳解Python中的編碼問題(encoding與decode、str與bytes)

4 文件編碼

在python 3 中字符是以Unicode的形式存儲的,當然這里所說的存儲是指存儲在計算機內(nèi)存當中,如果是存儲在硬盤里,Python 3的字符是以bytes形式存儲,也就是說如果要將字符寫入硬盤,就必須對字符進行encode。對上面這段話再解釋一下,如果要將str寫入文件,如果以‘w’模式寫入,則要求寫入的內(nèi)容必須是str類型;如果以‘wb’形式寫入,則要求寫入的內(nèi)容必須是bytes類型。文章開頭出現(xiàn)的幾種錯誤,就是因為寫入模式與寫入內(nèi)容的數(shù)據(jù)類型不匹配造成的。

s1 = ’你好’#如果是以‘w’的方式寫入,寫入前一定要進行encoding,否則會報錯 with open(’F:1.txt’,’w’,encoding=’utf-8’) as f1: f1.write(s1)s2 = s1.encode('utf-8')#轉(zhuǎn)換為bytes的形式#這時候?qū)懭敕绞揭欢ㄒ恰畐b’,且一定不能加encoding參數(shù)with open(’F:2.txt’,’wb’) as f2: f2.write(s2)

有的人會問,我在系統(tǒng)里面用文本編輯器打開以bytes形式寫入的2.txt文件,發(fā)現(xiàn)里面顯示的是‘你好’,而不是‘b’xe4xbdxa0xe5xa5xbd’’,因為文本文檔打開2.txt時,系統(tǒng)會用合適的編碼將其顯示為對應的符號,然后才給你看到。

5 網(wǎng)頁編碼

網(wǎng)頁編碼和文件編碼方法差不多,如下urlopen下載下來的網(wǎng)頁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 )#自定義的一個網(wǎng)頁下載函數(shù)#此處以UTF-8方式進行解碼,解碼后的數(shù)據(jù)以unicode的方式存儲在html中html = response.read().decode(’UTF-8’)print(type(html))#輸出結(jié)果:<class ’str’>#這時寫入方式一定要加encoding,以encoding# 即UTF-8的方式對二進制數(shù)據(jù)進行編碼才能寫入with open(’F:DownloadAppDatahtml.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))#輸出結(jié)果:<class ’bytes’>with open(’F:DownloadAppDatahtml.txt’,'wb' ) as f: f.write(html)

如果要在Python3中,對urlopen下載下來的網(wǎng)頁進行字符操作(例如正則匹配、lxml提取),就必須decode成Unicode。

作者:奧辰

微信號:chb1137796095

Github:https://github.com/ChenHuabin321

歡迎加V交流,共同學習,共同進步!

以上就是詳解Python中的編碼問題(encoding與decode、str與bytes)的詳細內(nèi)容,更多關(guān)于python 編碼的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標簽: Python 編程
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
免费看av不卡| 久久av日韩| 国产aⅴ精品一区二区四区| 国产欧美日韩免费观看| 日本不卡视频在线观看 | 亚洲有吗中文字幕| 免费精品视频| 国产精品三上| 久久最新视频| 日韩成人一级| 精品一级视频| 日本久久成人网| 亚洲特级毛片| 亚洲影视一区| 老司机免费视频一区二区三区| 麻豆国产精品777777在线| 福利视频一区| 婷婷成人基地| 日韩av网站免费在线| 激情不卡一区二区三区视频在线| 亚洲免费影院| 国产精品亚洲片在线播放| 中文字幕在线看片| 国产高清久久| 88久久精品| 免费精品视频在线| 精品三区视频| 综合国产精品| 国产一二在线播放| 亚洲一区二区三区无吗| 丰满少妇一区| 蜜桃久久久久久久| 在线天堂资源www在线污| 亚洲黄色影院| 高清不卡亚洲| 国产精品一区2区3区| 国产亚洲一区在线| 久久中文在线| 亚洲日产av中文字幕| 日韩精品午夜| 免费在线欧美黄色| 免费在线视频一区| 欧美日韩中文一区二区| 免费观看亚洲天堂| 少妇精品久久久一区二区三区| 久久国产毛片| 91视频一区| 欧美a一区二区| 亚洲tv在线| 在线一区二区三区视频| 欧美另类专区| 成人日韩精品| 国产探花一区| 日本精品另类| 日韩一区精品视频| 国产在线成人| 五月婷婷亚洲| 国产一区日韩一区| 香蕉成人av| 在线天堂中文资源最新版| 精品72久久久久中文字幕| 日韩综合小视频| 另类国产ts人妖高潮视频| 午夜电影亚洲| 婷婷丁香综合| 国产精品嫩草99av在线| 国产农村妇女精品一二区| 精品入口麻豆88视频| 国产白浆在线免费观看| 伊人久久国产| 亚洲性色视频| 一区二区三区午夜视频| 日韩美女国产精品| 国产精品宾馆| 欧美黄色一区| 美女福利一区二区三区| 欧美a级片一区| 亚洲精品无播放器在线播放| 日韩精品免费观看视频| 国产精品嫩模av在线| 欧美成人精品午夜一区二区| 国产第一亚洲| 日韩另类视频| 伊人国产精品| 国产一区福利| 噜噜噜躁狠狠躁狠狠精品视频 | 亚洲性视频h| 亚洲精品第一| 亚洲综合电影| 中文字幕日本一区二区| 国产欧美69| 色爱综合av| 日本免费一区二区视频| а√天堂8资源在线| 国产精品美女久久久| 日韩欧美2区| 久久精品亚洲欧美日韩精品中文字幕| 在线综合亚洲| 国产成人精品一区二区免费看京| 99在线|亚洲一区二区| 国产日韩欧美一区二区三区在线观看| 丝袜美腿一区| 久久精品99久久久| 亚洲激情精品| 欧美激情另类| 国产精品一区亚洲| 美女久久网站| | 午夜亚洲福利| 激情婷婷亚洲| 黄色精品视频| 欧美在线首页| 六月天综合网| 蜜臀久久99精品久久一区二区| 国产女人18毛片水真多18精品| 国产午夜精品一区二区三区欧美| 国产一区二区三区不卡av| 黄在线观看免费网站ktv| 国产精品.xx视频.xxtv| 日本欧美一区二区| 久久电影一区| 亚洲自啪免费| 成人国产精品一区二区免费麻豆| 久久大逼视频| 在线亚洲观看| 男人天堂欧美日韩| 亚洲一级少妇| 久久久久久夜| 亚洲伦乱视频| 亚洲天堂久久| 91久久久久| 鲁大师影院一区二区三区| 午夜欧美视频| 亚洲欧美日韩精品一区二区| 丝袜美腿亚洲一区二区图片| 亚洲精品1区2区| 一区免费在线| 亚洲久久在线| 亚洲激情另类| 婷婷综合一区| 麻豆一区二区99久久久久| 国产精品久久久久久久久久齐齐| 亚洲开心激情| 日本午夜免费一区二区| 国产欧美日韩一区二区三区四区| 精品国产aⅴ| 成人久久久久| 日本精品在线播放| 免费在线欧美黄色| 欧美日韩视频免费观看| 欧美日韩国产综合网| 亚洲精品乱码| 精品精品99| 亚洲先锋成人| 日韩精品一级中文字幕精品视频免费观看 | 麻豆精品久久久| 国产精品igao视频网网址不卡日韩 | 久久精品毛片| 在线一区视频观看| 久久福利影视| 国产精品sss在线观看av| 日韩av在线中文字幕| 一区二区亚洲精品| 国产欧美二区| 婷婷成人在线| 久久国际精品| 99久久久国产精品美女| 亚洲精品99| 成人国产精品一区二区免费麻豆| av不卡在线看| 精品视频免费| 色8久久久久| 日韩88av| 日韩va亚洲va欧美va久久| www.九色在线| 日韩久久99| 91国语精品自产拍| 国产高潮在线| 久久精品超碰| 亚洲性视频在线| 欧美福利在线| 天堂av在线| 伊人久久大香伊蕉在人线观看热v| 欧美www视频在线观看| 日韩福利在线观看| 亚洲尤物在线| 日韩欧美综合| 国产精品久久久免费| 亚洲精品免费观看| 亚洲激情偷拍| 久久三级福利| 日韩毛片视频| 国模大尺度视频一区二区| 国产精品一区三区在线观看| 午夜在线精品偷拍| 亚洲韩日在线| 不卡av一区二区| 成人小电影网站| 福利一区二区三区视频在线观看| 久久精品一区|