欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

淺析Python 3 字符串中的 STR 和 Bytes 有什么區(qū)別

系統(tǒng) 1724 0

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)格的限制也讓我們對(duì)如何使用它們有了清晰的認(rèn)識(shí),這是很棒的。

Python2 和 Python3 的區(qū)別

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

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

In [2]: 'a' in u'a'Out[2]: True

In [3]: '編程' == u'編程'/usr/local/bin/ipython:1: UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal#!/usr/bin/pythonOut[3]: False

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

            
               in 
              
                ()
----> 1 '編程' in u'編程'

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是一樣的;而對(duì)應(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)換

一圖勝千言:

淺析Python 3 字符串中的 STR 和 Bytes 有什么區(qū)別_第1張圖片

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

            
str.encode(‘encoding') -> bytes
bytes.decode(‘encoding') -> str
          

Encoding指的是具體的編碼規(guī)則的名稱,對(duì)于中文來說,它可以是這些值: ‘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)換是針對(duì)文本內(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 
              
                ()----> 1 img.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 
              
                ()
----> 1 open('z.txt', 'w').write(img)

TypeError: write() argument must be str, not bytes

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)存中對(duì)文本數(shù)據(jù)進(jìn)行使用的,Bytes是對(duì)二進(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等)。

總結(jié)

以上所述是小編給大家介紹的Python 3 字符串中的 STR 和 Bytes 有什么區(qū)別,希望對(duì)大家有所幫助,如果大家有任何疑問歡迎給我留言,小編會(huì)及時(shí)回復(fù)大家的!


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會(huì)非常 感謝您的哦?。?!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 久久中文字幕免费 | 91精品啪在线观看国产91九色 | 国产精品无码专区在线观看 | 日韩国产一区 | 久久国产精品视频 | 国产成人自拍一区 | av在线官网| 精品国产乱码久久久久久88av | 欧美在线播放一区 | 亚洲 欧美 日韩中文字幕一区二区 | 日韩一区二区三区四区 | 亚洲aⅴ | 亚洲欧美一区二区三区国产精品 | 亚洲伊人久久综合 | 91av免费 | 国产亚洲成在线播放va | 国产精品视频免费的 | 久久久久毛片成人精品 | 97麻豆精品国产自产在线观看 | 欧美ab在线 | www.伊人 | 亚洲激情一区 | 欧美在线观看视频一区 | 久久精品视频免费 | 亚洲成a人片在线观看www流畅 | 亚洲人人草 | 91成人影院 | 天天天插| 2019中文字幕在线播放 | 久久99热久久精品23 | 91成人影院未满十八勿入 | 狠狠干在线 | 日韩欧美一区二区三区四区 | 一级毛片观看 | av黄色在线观看 | 国产在线自在拍91精品黑人 | 国产成人手机在线好好热 | 性欧美激情在线观看 | 亚洲精品日韩精品一区 | 一级在线免费视频 | 国产精品va一区二区三区 |