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

首頁 > 編程 > Python > 正文

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

2020-01-04 14:22:16
字體:
來源:轉載
供稿:網友

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

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

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

Python2 和 Python3 的區別

通過以下代碼我們認識以下Python2和Python3的字符串混用情況:

# Python2中:In [1]: 'a' == u'a'Out[1]: TrueIn [2]: 'a' in u'a'Out[2]: TrueIn [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]: FalseIn [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]: FalseIn [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碼時混用沒區別,因為Unicode的ASCII區域的值跟str的ASCII是一樣的;而對應非ASCII區域(比如中文),二者又不一樣了。

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

在Python3中,嚴格區分了str和Bytes,不同類型之間操作就會拋出Type Error的異常。

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

str和bytes之間的轉換

 

一圖勝千言:

Python3,字符串,STR,Bytes

str和bytes的相互轉換

 

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

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

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

下面看看具體代碼理解一下str和Bytes的相互轉換:

In [16]: a = 'T恤'In [17]: aOut[17]: 'T恤'In [18]: len(a)Out[18]: 2In [19]: b = a.encode('utf8')In [20]: bOut[20]: b'T/xe6/x81/xa4'In [21]: a == bOut[21]: FalseIn [22]: c = a.encode('gbk')In [23]: cOut[23]: b'T/xd0/xf4'In [24]: b == cOut[24]: FalseIn [25]: a == cOut[25]: False

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

 

In [29]: img = open('str-bytes.jpg', 'rb').read()In [30]: type(img)Out[30]: bytesIn [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

因為圖片中的二進制數據不符合文本數據的UTF-8編碼規則。

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

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 bytesIn [34]: open('z.txt', 'wb').write(img)Out[34]: 12147

 

讀寫二進制數據(如圖片)時,要加'rb'參數,b代碼Binary(二進制)。讀寫文本數據時,一般加'b',open()會自動轉換Bytes到str。

總結一下

Python3里面的str是在內存中對文本數據進行使用的,Bytes是對二進制數據使用的。

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

Bytes一般來自網絡讀取的數據、從二進制文件(圖片等)讀取的數據、以二進制模式讀取的文本文件(.txt, .html, .py, .cpp等)。

總結

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


注:相關教程知識閱讀請移步到python教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 洪泽县| 余江县| 海林市| 乡宁县| 锡林浩特市| 聂荣县| 察雅县| 枝江市| 澳门| 韶山市| 灵川县| 东辽县| 桂林市| 昭平县| 揭西县| 湘潭市| 吴桥县| 建德市| 兴隆县| 台湾省| 平乐县| 顺义区| 九台市| 西昌市| 广宗县| 博罗县| 竹北市| 怀宁县| 嘉禾县| 昌乐县| 崇阳县| 南丹县| 南川市| 合山市| 菏泽市| 永和县| 宜春市| 苍梧县| 潢川县| 册亨县| 凤庆县|