亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

 更新時間:2018年10月14日 15:02:57   投稿:mrr  
Python2的str相當于Python3的Bytes,而Unicode相當于Python3的Bytes。這篇文章主要介紹了Python 3 字符串中的 STR 和 Bytes 究竟有什么區(qū)別?需要的朋友可以參考下

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

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

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

Python2 和 Python3 的區(qū)別

通過以下代碼我們認識以下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碼時混用沒區(qū)別,因為Unicode的ASCII區(qū)域的值跟str的ASCII是一樣的;而對應(yīng)非ASCII區(qū)域(比如中文),二者又不一樣了。

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

在Python3中,嚴格區(qū)分了str和Bytes,不同類型之間操作就會拋出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)容的,要是其它二進制內(nèi)容(比如,圖片)時,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

因為圖片中的二進制數(shù)據(jù)不符合文本數(shù)據(jù)的UTF-8編碼規(guī)則。

上面獲得圖片數(shù)據(jù)時,我們用到了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 bytes

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

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

總結(jié)一下

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

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

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

總結(jié)

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

相關(guān)文章

  • Python實現(xiàn)將視頻按照時間維度剪切

    Python實現(xiàn)將視頻按照時間維度剪切

    這篇文章主要為大家詳細介紹了如何利用Python實現(xiàn)將視頻按照時間維度進行剪切,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起了解一下
    2022-12-12
  • 如何用Python?實現(xiàn)景區(qū)安防系統(tǒng)

    如何用Python?實現(xiàn)景區(qū)安防系統(tǒng)

    本設(shè)計中,利用YOLO目標檢測算法、Openpose姿態(tài)識別算法、deepsort跟蹤算法、MSCNN人群密度估計算法實現(xiàn)了火災(zāi)監(jiān)測、吸煙監(jiān)測、行為安全監(jiān)測、人群密度監(jiān)測、口罩率監(jiān)測、人員定位監(jiān)測六大功能,對Python?實現(xiàn)景區(qū)安防系統(tǒng)感興趣的朋友一起看看吧
    2022-07-07
  • Python編程異步爬蟲之a(chǎn)iohttp模塊的基本用法

    Python編程異步爬蟲之a(chǎn)iohttp模塊的基本用法

    aiohttp?模塊是一個基于?asyncio?的?HTTP?客戶端和服務(wù)器框架,可以用于異步處理?HTTP?請求和響應(yīng),這篇文章給大家介紹Python編程異步爬蟲之a(chǎn)iohttp模塊的基本用法,感興趣的朋友一起看看吧
    2024-03-03
  • Python中的特殊方法以及應(yīng)用詳解

    Python中的特殊方法以及應(yīng)用詳解

    這篇文章主要給大家介紹了關(guān)于Python中特殊方法以及應(yīng)用的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-09-09
  • pytorch固定BN層參數(shù)的操作

    pytorch固定BN層參數(shù)的操作

    這篇文章主要介紹了pytorch固定BN層參數(shù)的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-05-05
  • python批量識別圖片指定區(qū)域文字內(nèi)容

    python批量識別圖片指定區(qū)域文字內(nèi)容

    這篇文章主要為大家詳細介紹了python識別圖片指定區(qū)域文字內(nèi)容,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-04-04
  • Python多線程、異步+多進程爬蟲實現(xiàn)代碼

    Python多線程、異步+多進程爬蟲實現(xiàn)代碼

    這篇文章主要介紹了Python多線程、異步+多進程爬蟲實現(xiàn)代碼,需要的朋友可以參考下
    2016-02-02
  • python實現(xiàn)三種字符串格式化方法(%、format、f-string)

    python實現(xiàn)三種字符串格式化方法(%、format、f-string)

    本文主要介紹了python實現(xiàn)三種字符串格式化方法,主要包括%、format、f-string,具有一定的參考價值,感興趣的可以了解一下
    2023-10-10
  • 對Python獲取屏幕截圖的4種方法詳解

    對Python獲取屏幕截圖的4種方法詳解

    今天小編就為大家分享一篇對Python獲取屏幕截圖的4種方法詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-08-08
  • Python實現(xiàn)字符串模糊匹配方式

    Python實現(xiàn)字符串模糊匹配方式

    這篇文章主要介紹了Python實現(xiàn)字符串模糊匹配方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11

最新評論