成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

聊聊Python3的字符串:str和bytes的區(qū)別-創(chuàng)新互聯(lián)

創(chuàng)新互聯(lián)專注于企業(yè)網(wǎng)絡(luò)營(yíng)銷推廣、網(wǎng)站重做改版、霍林郭勒網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、H5技術(shù)、商城網(wǎng)站建設(shè)、集團(tuán)公司官網(wǎng)建設(shè)、外貿(mào)網(wǎng)站建設(shè)、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁(yè)設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性價(jià)比高,為霍林郭勒等各大城市提供網(wǎng)站開(kāi)發(fā)制作服務(wù)。

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

Python2里面的str和unicode是可以混用的,在都是英文字母的時(shí)候str和unicode沒(méi)有區(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ū)別

通過(guò)以下代碼我們認(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)
<ipython-input-4-7b677a923254> in <module>()
----> 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)
<ipython-input-10-ca907fd8856f> in <module>()
----> 1 'a' in b'a'
TypeError: a bytes-like object is required, not 'str'

以上代碼可以看到,Python2中str和unicode的在都是ascii碼時(shí)混用沒(méi)區(qū)別,因?yàn)閡nicode的ascii區(qū)域的值跟str的ascii是一樣的;而對(duì)應(yīng)非ascii區(qū)域(比如中文),二者又不一樣了,可以看到Python2拋出了UnicodeDecodeError的異常,相信這也是很多人處理文本時(shí)遇到過(guò)的錯(cuò)誤;‘編程’在str類型時(shí)長(zhǎng)度是6,而在unicode時(shí)是2。不同字符的不同表現(xiàn),讓Python2的str和unicode顯得撲朔迷離。

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

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

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

一圖勝千言:

聊聊Python 3 的字符串:str 和 bytes 的區(qū)別

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

str.encode(‘encoding’) -> bytes

bytes.decode(‘encoding’) -> str

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

不知道你有沒(méi)有注意到上圖中str矩形要比bytes矩形短,表示同樣的內(nèi)容,str的長(zhǎng)度要小于或等于bytes的長(zhǎng)度,你可以考慮一下原因(參考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)
<ipython-input-31-c9e28f45be95> in <module>()----> 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()來(lái)讀取文件,文件存儲(chǔ)的無(wú)非是文本和二進(jìn)制這兩種格式,讀寫(xiě)文件時(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)
<ipython-input-33-4a88980b3a54> in <module>()
----> 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

讀寫(xiě)二進(jìn)制數(shù)據(jù)(如圖片)時(shí),要加’rb’參數(shù),b代碼binary(二進(jìn)制)

讀寫(xiě)文本數(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,也就是說(shuō)decode使用的編碼決定了decode()的成敗,同樣的,UTF-8編碼的bytes字符串用GBK去decode()也會(huì)出錯(cuò)。

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


文章首發(fā)于我的個(gè)人博客,同時(shí)我也在 猿人學(xué)網(wǎng)站 上寫(xiě)Python教程
你也可以關(guān)注我的個(gè)人公眾號(hào):猿人學(xué)Python

本文名稱:聊聊Python3的字符串:str和bytes的區(qū)別-創(chuàng)新互聯(lián)
文章URL:http://jinyejixie.com/article28/ccsecp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供虛擬主機(jī)標(biāo)簽優(yōu)化、軟件開(kāi)發(fā)、自適應(yīng)網(wǎng)站、網(wǎng)站收錄、電子商務(wù)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)
云霄县| 安达市| 师宗县| 乐陵市| 如东县| 麻城市| 寿阳县| 桐城市| 金阳县| 三门县| 祥云县| 措美县| 玉门市| 英德市| 巴青县| 噶尔县| 昌宁县| 镇安县| 蕉岭县| 青冈县| 翼城县| 兴海县| 新津县| 禹城市| 东丽区| 安宁市| 无锡市| 志丹县| 文安县| 阳江市| 军事| 梁河县| 新化县| 台中县| 齐齐哈尔市| 乳源| 都匀市| 镇宁| 新河县| 章丘市| 绵阳市|