中文字幕理论片,69视频免费在线观看,亚洲成人app,国产1级毛片,刘涛最大尺度戏视频,欧美亚洲美女视频,2021韩国美女仙女屋vip视频

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
Python 3 字符串中的 STR和Bytes 究竟有什么區(qū)別?

作者 | veelion

責(zé)編 | 胡巍巍

Python2的字符串有兩種:str和Unicode,Python3的字符串也有兩種:str和Bytes。Python2的str相當(dāng)于Python3的Bytes,而Unicode相當(dāng)于Python3的Bytes。

Python2里面的str和Unicode是可以混用的,在都是英文字母的時(shí)候str和unicode沒有區(qū)別。

而Python3嚴(yán)格區(qū)分文本(str)和二進(jìn)制數(shù)據(jù)(Bytes),文本總是Unicode,用str類型,二進(jìn)制數(shù)據(jù)則用Bytes類型表示,這樣嚴(yán)格的限制也讓我們對如何使用它們有了清晰的認(rèn)識(shí),這是很棒的。

Python2 和 Python3 的區(qū)別

通過以下代碼我們認(rèn)識(shí)以下Python2和Python3的字符串混用情況:

# Python2中:In[1]:'a'== u'a'Out[1]: True

In[2]:'a'inu'a'Out[2]: True

In[3]:'編程'== u'編程'/usr/local/bin/ipython:1: UnicodeWarning: Unicode equal comparison failedtoconvert both argumentstoUnicode - interpreting themasbeing unequal#!/usr/bin/pythonOut[3]: False

In[4]:'編程'inu'編程'---------------------------------------------------------------------------UnicodeDecodeError Traceback (most recent call last)

in()

---->1'編程'inu'編程'

UnicodeDecodeError:'ascii'codec can't decode byte 0xe7 in position 0: ordinal not in range(128)

# Python3中:

In [1]: 'a' == b'a'Out[1]: False

In [2]: 'a' in b'a'---------------------------------------------------------------------------TypeError Traceback (most recent call last)

in ()

----> 1 'a' in b'a'

TypeError: a bytes-like object is required, not 'str'

以上代碼可以看到,Python2中str和Unicode在都是ASCII碼時(shí)混用沒區(qū)別,因?yàn)閁nicode的ASCII區(qū)域的值跟str的ASCII是一樣的;而對應(yīng)非ASCII區(qū)域(比如中文),二者又不一樣了。

可以看到Python2拋出了Unicode Decode Error的異常,相信這也是很多人處理文本時(shí)遇到過的錯(cuò)誤;‘編程’在str類型時(shí)長度是6,而在Unicode時(shí)是2。不同字符的不同表現(xiàn),讓Python2的str和Unicode顯得撲朔迷離。

在Python3中,嚴(yán)格區(qū)分了str和Bytes,不同類型之間操作就會(huì)拋出Type Error的異常。

上面用示例闡述了Python2和Python3中字符串的不同,下面主要講Python3中的字符串。

str和bytes之間的轉(zhuǎn)換

一圖勝千言:

str和bytes的相互轉(zhuǎn)換

str.encode(‘encoding’) -> bytes

bytes.decode(‘encoding’) -> str

Encoding指的是具體的編碼規(guī)則的名稱,對于中文來說,它可以是這些值: ‘utf-8’, ‘gb2312’, ‘gbk’, ‘big5’ 等等。

不知道你有沒有注意到上圖中str矩形要比Bytes矩形短,表示同樣的內(nèi)容,str的長度要小于或等于Bytes的長度,你可以考慮一下原因(參考Unicode、UTF-8的編碼規(guī)則)。

下面看看具體代碼理解一下str和Bytes的相互轉(zhuǎn)換:

In[16]: a ='T恤'In[17]: a

Out[17]:'T恤'In[18]: len(a)

Out[18]:2In[19]: b = a.encode('utf8')

In[20]: b

Out[20]: b'T\xe6\x81\xa4'In[21]: a == b

Out[21]: FalseIn [22]: c = a.encode('gbk')

In[23]: c

Out[23]: b'T\xd0\xf4'In[24]: b == c

Out[24]: FalseIn [25]: a == c

Out[25]: False

上面str和Bytes之間的轉(zhuǎn)換是針對文本內(nèi)容的,要是其它二進(jìn)制內(nèi)容(比如,圖片)時(shí),Bytes就不能decode成str了,看以下代碼的異常:

In[29]: img = open('str-bytes.jpg','rb').read()

In[30]:type(img)

Out[30]: bytes

In[31]: img.decode('utf8')

---------------------------------------------------------------------------

UnicodeDecodeError Traceback (most recent call last)

in()---->1img.decode('utf8')UnicodeDecodeError:'utf-8'codec can't decode byte 0xff in position 0: invalid start byte

因?yàn)閳D片中的二進(jìn)制數(shù)據(jù)不符合文本數(shù)據(jù)的UTF-8編碼規(guī)則。

上面獲得圖片數(shù)據(jù)時(shí),我們用到了open()來讀取文件,文件存儲(chǔ)的無非是文本和二進(jìn)制這兩種格式,讀寫文件時(shí)也有分清楚編碼:

In[32]: open('z.txt','w').write('T恤')

Out[32]:2In[33]: open('z.txt','w').write(img)

---------------------------------------------------------------------------

TypeError Traceback (most recent call last)

in()

---->1open('z.txt','w').write(img)

TypeError:write() argument must be str,notbytes

In[34]: open('z.txt','wb').write(img)

Out[34]:12147

讀寫二進(jìn)制數(shù)據(jù)(如圖片)時(shí),要加’rb’參數(shù),b代碼Binary(二進(jìn)制)。讀寫文本數(shù)據(jù)時(shí),一般加’b’,open()會(huì)自動(dòng)轉(zhuǎn)換Bytes到str。

總結(jié)一下

Python3里面的str是在內(nèi)存中對文本數(shù)據(jù)進(jìn)行使用的,Bytes是對二進(jìn)制數(shù)據(jù)使用的。

str可以encode為Bytes,但是Bytes不一定可以decode為str。實(shí)際上Bytes.decode(‘latin1’)可以稱為str,也就是說decode使用的編碼決定了decode()的成敗,同樣的,UTF-8編碼的Bytes字符串用GBK去decode()也會(huì)出錯(cuò)。

Bytes一般來自網(wǎng)絡(luò)讀取的數(shù)據(jù)、從二進(jìn)制文件(圖片等)讀取的數(shù)據(jù)、以二進(jìn)制模式讀取的文本文件(.txt, .html, .py, .cpp等)。

作者:veelion,具有十年開發(fā)經(jīng)驗(yàn),主要使用Python、C++語言,從事網(wǎng)絡(luò)爬蟲、搜索引擎、自然語言理解處理等領(lǐng)域的研發(fā)工作。

聲明:本文為作者投稿,版權(quán)歸對方所有。

微信改版了,

想快速看到CSDN的熱乎文章,

趕快把CSDN公眾號(hào)設(shè)為星標(biāo)吧,

打開公眾號(hào),點(diǎn)擊“設(shè)為星標(biāo)”就可以啦!

2018 AI開發(fā)者大會(huì)

AI工程師必備大會(huì)

2018 AI開發(fā)者大會(huì)是一場由中美人工智能技術(shù)高手聯(lián)袂打造的AI技術(shù)與產(chǎn)業(yè)的年度盛會(huì)!我們只講技術(shù),拒絕空談!

這里有10場技術(shù)專題論壇:計(jì)算機(jī)視覺、數(shù)據(jù)分析、機(jī)器學(xué)習(xí)、知識(shí)圖譜、智慧金融、智能駕駛、語音技術(shù)、智慧醫(yī)療、機(jī)器學(xué)習(xí)工具、自然語言處理。

還有15+硅谷實(shí)力講師團(tuán)、80+AI領(lǐng)軍企業(yè)技術(shù)核心人物、100+技術(shù)&大眾實(shí)力媒體、1500+AI專業(yè)開發(fā)者

點(diǎn)擊下方「海報(bào),快速獲取大會(huì)更多信息,并獲得最低折扣票!

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊舉報(bào)
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
字符編碼
Python encode和decode
python3中編碼與解碼之Unicode與bytes
(ok)Python3編碼問題 Unicode utf
專業(yè)在線電子書網(wǎng)站
Python 編碼為什么那么蛋疼?
更多類似文章 >>
生活服務(wù)
熱點(diǎn)新聞
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服