最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

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

而Python3嚴(yán)格區(qū)分文本(str)和二進(jìn)制數(shù)據(jù)(Bytes),文本總是Unicode,用str類(lèi)型,二進(jìn)制數(shù)據(jù)則用Bytes類(lèi)型表示,這樣嚴(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拋出了Unicode Decode Error的異常,相信這也是很多人處理文本時(shí)遇到過(guò)的錯(cuò)誤;‘編程'在str類(lèi)型時(shí)長(zhǎng)度是6,而在Unicode時(shí)是2。不同字符的不同表現(xiàn),讓Python2的str和Unicode顯得撲朔迷離。

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

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

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

一圖勝千言:

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

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

Encoding指的是具體的編碼規(guī)則的名稱(chēng),對(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')可以稱(chēng)為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等)。

總結(jié)

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

相關(guān)文章

  • Keras搭建分類(lèi)網(wǎng)絡(luò)平臺(tái)VGG16?MobileNet?ResNet50

    Keras搭建分類(lèi)網(wǎng)絡(luò)平臺(tái)VGG16?MobileNet?ResNet50

    這篇文章主要為大家介紹了Keras搭建分類(lèi)網(wǎng)絡(luò)平臺(tái)VGG16?MobileNet?ResNet50,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • Python利用appium實(shí)現(xiàn)模擬手機(jī)滑動(dòng)操控的操作

    Python利用appium實(shí)現(xiàn)模擬手機(jī)滑動(dòng)操控的操作

    Appium 是一個(gè)開(kāi)源、跨平臺(tái)的自動(dòng)化測(cè)試工具,用于測(cè)試原生和輕量移動(dòng)應(yīng)用,支持 iOS, Android 和 FirefoxOS 平臺(tái)。本文將利用appium實(shí)現(xiàn)模擬手機(jī)滑動(dòng)操控的操作,感興趣的可以了解一下
    2022-07-07
  • python讓函數(shù)不返回結(jié)果的方法

    python讓函數(shù)不返回結(jié)果的方法

    在本篇內(nèi)容里小編給大家整理的是關(guān)于python讓函數(shù)不返回結(jié)果的方法,有需要的朋友們可以參考下。
    2020-06-06
  • 基于python監(jiān)控程序是否關(guān)閉

    基于python監(jiān)控程序是否關(guān)閉

    這篇文章主要介紹了基于python監(jiān)控程序是否關(guān)閉,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-01-01
  • Python中4種實(shí)現(xiàn)數(shù)值的交換方式

    Python中4種實(shí)現(xiàn)數(shù)值的交換方式

    這篇文章主要介紹了Python中4種實(shí)現(xiàn)數(shù)值的交換方式,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-08-08
  • Python利用capstone實(shí)現(xiàn)反匯編

    Python利用capstone實(shí)現(xiàn)反匯編

    Capstone是一個(gè)輕量級(jí)的多平臺(tái)、多架構(gòu)的反匯編框架,該模塊支持目前所有通用操作系統(tǒng),反匯編架構(gòu)幾乎全部支持。本文就將利用他實(shí)現(xiàn)反匯編,感興趣的可以了解下
    2022-04-04
  • Python中的“_args”和“__kwargs”用法詳解

    Python中的“_args”和“__kwargs”用法詳解

    *args 和 **kwargs 主要?于函數(shù)定義,你可以將不定數(shù)量的參數(shù)傳遞給?個(gè)函數(shù),這篇文章主要介紹了Python中的“_args”和“__kwargs”用法,需要的朋友可以參考下
    2023-01-01
  • 淺談Python中的函數(shù)傳遞問(wèn)題

    淺談Python中的函數(shù)傳遞問(wèn)題

    這篇文章主要為大家介紹了Python函數(shù)傳遞問(wèn)題,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2021-11-11
  • Pandas之DataFrame對(duì)象的列和索引之間的轉(zhuǎn)化

    Pandas之DataFrame對(duì)象的列和索引之間的轉(zhuǎn)化

    這篇文章主要介紹了Pandas之DataFrame對(duì)象的列和索引之間的轉(zhuǎn)化,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • 提升Python編碼能力的3個(gè)重要概念

    提升Python編碼能力的3個(gè)重要概念

    這篇文章主要給大家分享的是提升Python編碼能力的3個(gè)重要概念,圍繞提升Python編碼的相關(guān)自資料上下文管理器、類(lèi)型提示、淺拷貝和深拷貝等內(nèi)容展開(kāi)文章,需要的小伙伴可以參考一下
    2022-02-02

最新評(píng)論

郧西县| 和田县| 凉山| 丰城市| 平湖市| 江华| 安多县| 荥经县| 萍乡市| 长岭县| 乌苏市| 岳池县| 平遥县| 临泽县| 武隆县| 河北区| 岳池县| 洪洞县| 伽师县| 邹城市| 江华| 柘荣县| 开阳县| 黑山县| 平潭县| 英山县| 曲沃县| 都昌县| 贵溪市| 驻马店市| 宜川县| 电白县| 达尔| 繁昌县| 泸定县| 贡觉县| 万盛区| 耿马| 安宁市| 平舆县| 古蔺县|