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

Effective Python bytes 與 str 的區(qū)別

 更新時(shí)間:2021年11月15日 14:20:27   作者:小菠蘿  
這篇文章主要介紹了Effective Python bytes 與 str 的區(qū)別,Python 有兩種類型可以表示字符序列,下面圍繞Python bytes 與 str 的相關(guān)資料展開內(nèi)容,需要的朋友可以參考一下

1、Python 有兩種類型可以表示字符序列

  • bytes:實(shí)例包含的是 原始數(shù)據(jù) ,即 8 位的無符號(hào)值(通常按照 ASCII 編碼 標(biāo)準(zhǔn)來顯示)
  • str:實(shí)例包含的是 Unicode 碼點(diǎn)(code point,也叫作代碼點(diǎn)),這些碼點(diǎn)與人類語(yǔ)言之中的文本字符相對(duì)應(yīng)
a = b'h\x6511o'
print(list(a))
print(a)

a = 'a\\u300 propos'
print(list(a))
print(a)


# 輸出結(jié)果
[104, 101, 49, 49, 111]
b'he11o'

['a', '\\', 'u', '3', '0', '0', ' ', 'p', 'r', 'o', 'p', 'o', 's']
a\u300 propos

2、Unicode 數(shù)據(jù)和二進(jìn)制數(shù)據(jù)轉(zhuǎn)換

  • 把  Unicode 數(shù)據(jù)轉(zhuǎn)換成二進(jìn)制數(shù)據(jù),必須調(diào)用 str 的 encode 方法(編碼)
  • 把二進(jìn)制數(shù)據(jù)轉(zhuǎn)換成 Unicode 數(shù)據(jù),必須調(diào)用 bytes 的 decode 方法(解碼)
  • 調(diào)用這些方法時(shí),可以明確指出字符集編碼,也可以采用系統(tǒng)默認(rèn)的方案,通常是 UTF-8

3、使用原始的 8 位值與 Unicode 字符串

使用原始的 8 位值與 Unicode 字符串時(shí)需要注意的兩個(gè)問題:

  • 該問題等價(jià)于:使用 bytes str 時(shí)需要注意的兩個(gè)問題

3.1 問題一:bytes 和 str 的實(shí)例互不兼容

使用 + 操作符:

# bytes+bytes
print(b'a' + b'1')

# str+str
print('b' + '2')


# 輸出結(jié)果
b'a1'
b2


  • bytes + bytesstr + str 都是允許的
  • bytes + str 會(huì)報(bào)錯(cuò)

#

 bytes+str
print('c' + b'2')


# 輸出結(jié)果
print('c' + b'2')
TypeError: can only concatenate str (not "bytes") to str

同類型之間也可以用二元操作符來比較大小

assert b'c' > b'a'

assert 'c' > 'a'

bytes str 之間用二元操作符也會(huì)報(bào)錯(cuò)

assert b'c' > 'a'


# 輸出結(jié)果
    assert b'c' > 'a'
TypeError: '>' not supported between instances of 'bytes' and 'str'

判斷 bytes str 實(shí)例是否相等
兩個(gè)類型的實(shí)例相比較總會(huì)為 False,即使字符完全相同

# 判斷 str、bytes
print('a' == b'a')


# 輸出結(jié)果
False

格式化字符串中的 %s

兩種類型的實(shí)例都可以出現(xiàn)在 % 操作符的右側(cè),用來替換左側(cè)那個(gè)格式字符串(format string)里面的 %s

但是!如果格式字符串是 bytes 類型,那么 不能 用 str 實(shí)例來替換其中的 %s ,因?yàn)?Python 不知道這個(gè) str 應(yīng)該按照什么字符集來編碼

# %
print(b'red %s' % 'blue')


# 輸出結(jié)果
    print(b'red %s' % 'blue')
TypeError: %b requires a bytes-like object, or an object that implements __bytes__, not 'str'


但是!反過來卻可以,如果格式字符串是 str 類型,則 可以 用bytes 實(shí)例來替換其中的 %s,但結(jié)果可能不是預(yù)期結(jié)果

# % 
print('red %s' % b'blue')


# 輸出結(jié)果
red b'blue'

這樣會(huì)讓系統(tǒng)在 bytes 實(shí)例上面調(diào)用  __repr__  方法
調(diào)用結(jié)果替換格式字符串里的 %s,因此程序會(huì)直接輸出 b'blue',而不是輸出 blue

3.2問題二:操作文件句柄時(shí)需要使用 Unicode 字符串操作

不能使用原始的 bytes

向文件寫入二進(jìn)制數(shù)據(jù)會(huì)報(bào)錯(cuò):

# 寫入二進(jìn)制數(shù)據(jù)
with open('test.txt', "w+") as f:
    f.write(b"\xf1\xf2")


# 輸出結(jié)果
    f.write(b"\xf1\xf2")
TypeError: write() argument must be str, not bytes


  • 報(bào)錯(cuò)是因?yàn)?code> w 模式必須以 文本 模式寫入
  • 將模式改成 wb 即可正常寫入二進(jìn)制數(shù)據(jù)
with open('test.txt', "wb") as f:
    f.write(b"\xf1\xf2")
讀取文件中二進(jìn)制數(shù)據(jù)
with open('test.txt', "r+") as f:
    f.read()


# 輸出結(jié)果
    (result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xf1 in position 0: invalid continuation byte
 

  • 報(bào)錯(cuò)是因?yàn)?r 模式必須以 文本 模式讀取
  • 以文本模式操縱文件句柄時(shí),系統(tǒng)會(huì)采用 默認(rèn)的文本編碼 方案處理二進(jìn)制數(shù)據(jù)
  • 所以,上面那種寫法會(huì)讓系統(tǒng)通過 bytes.decode 把這份數(shù)據(jù)解碼成 str 字符串,再用 str.encode 把字符串編碼成二進(jìn)制值
  • 然而對(duì)于大多數(shù)系統(tǒng)來說,默認(rèn)的文本編碼方案是UTF-8,所以系統(tǒng)很可能會(huì)把 b'\xf1\xf2\xf3\xf4\xf5' 當(dāng)成  UTF-8 格式的字符串去解碼,于是就會(huì)出現(xiàn)上面那樣的錯(cuò)誤

將模式改成 rb 即可正常讀取二進(jìn)制數(shù)據(jù):

with open('test.txt', "rb") as f:
    print(b"\xf1\xf2" == f.read())


# 輸出結(jié)果
True


另一種改法,設(shè)置 encoding 參數(shù)指定字符串編碼:

with open('test.txt', "r", encoding="cp1252") as f:
    print(f.read())


# 輸出結(jié)果
ñò


這樣也不會(huì)有異常了

需要注意:當(dāng)前操作系統(tǒng)默認(rèn)的字符集編碼,Python 一行代碼查看當(dāng)前操作系統(tǒng)默認(rèn)的編碼標(biāo)準(zhǔn)

在 cmd 中執(zhí)行:

> python3 -c 'import locale; print(locale.getpreferredencoding())'
UTF-8

到此這篇關(guān)于Effective Python bytes 與 str 的區(qū)別的文章就介紹到這了,更多相關(guān)Python bytes 與 str 的區(qū)別內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Pytest斷言的具體使用

    Pytest斷言的具體使用

    本文主要介紹了Pytest斷言的具體使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • Python實(shí)現(xiàn)優(yōu)先級(jí)隊(duì)列結(jié)構(gòu)的方法詳解

    Python實(shí)現(xiàn)優(yōu)先級(jí)隊(duì)列結(jié)構(gòu)的方法詳解

    優(yōu)先級(jí)隊(duì)列(priority queue)是0個(gè)或多個(gè)元素的集合,每個(gè)元素都有一個(gè)優(yōu)先權(quán),接下來就來看一下簡(jiǎn)潔的Python實(shí)現(xiàn)優(yōu)先級(jí)隊(duì)列結(jié)構(gòu)的方法詳解:
    2016-06-06
  • python貪吃蛇游戲代碼

    python貪吃蛇游戲代碼

    這篇文章主要為大家詳細(xì)介紹了python貪吃蛇游戲代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • Python Switch Case三種實(shí)現(xiàn)方法代碼實(shí)例

    Python Switch Case三種實(shí)現(xiàn)方法代碼實(shí)例

    這篇文章主要介紹了Python Switch Case2種實(shí)現(xiàn)方法代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-06-06
  • pycharm中dgl安裝報(bào)錯(cuò)FileNotFoundError:Could not find module ‘E:\XXXX\XXXX\lib\site-packages\dgl\dgl.dl

    pycharm中dgl安裝報(bào)錯(cuò)FileNotFoundError:Could not find&nb

    這篇文章主要介紹了pycharm中dgl安裝報(bào)錯(cuò)FileNotFoundError:Could not find module ‘E:\XXXX\XXXX\lib\site-packages\dgl\dgl.dl問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • python中remove函數(shù)的踩坑記錄

    python中remove函數(shù)的踩坑記錄

    這篇文章主要給大家介紹了關(guān)于python中remove函數(shù)的踩坑記錄,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • Python實(shí)現(xiàn)為PDF大文件批量去除水印

    Python實(shí)現(xiàn)為PDF大文件批量去除水印

    在閱讀過程中如果遇到一些帶有水印的資料是比較煩心的,而市面上去水印的功能有多要收費(fèi)且很不方便,那么,如何通過Python來對(duì)這類圖片水印進(jìn)行去除呢,本文就來和大家分享一下實(shí)現(xiàn)方法吧
    2023-05-05
  • django 認(rèn)證類配置實(shí)現(xiàn)

    django 認(rèn)證類配置實(shí)現(xiàn)

    本文主要介紹了django 認(rèn)證類配置實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • python基礎(chǔ)教程之基本數(shù)據(jù)類型和變量聲明介紹

    python基礎(chǔ)教程之基本數(shù)據(jù)類型和變量聲明介紹

    這篇文章主要介紹了python基礎(chǔ)教程之基本數(shù)據(jù)類型和變量聲明介紹,首先講解了變量聲明的一些知識(shí),然后列出最常用的基本數(shù)據(jù)類型,需要的朋友可以參考下
    2014-08-08
  • 輕松理解Python 中的 descriptor

    輕松理解Python 中的 descriptor

    本文給大家分Python 中的 descriptor相關(guān)知識(shí),非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧
    2017-09-09

最新評(píng)論

周口市| 通城县| 大名县| 吴桥县| 尉犁县| 靖江市| 谷城县| 平塘县| 出国| 剑阁县| 南乐县| 波密县| 菏泽市| 徐闻县| 红桥区| 集安市| 攀枝花市| 江口县| 鲁甸县| 眉山市| 登封市| 稻城县| 卢湾区| 荥经县| 兰西县| 白玉县| 湖口县| 肇东市| 宜阳县| 柯坪县| 巍山| 仪陇县| 涞水县| 扎鲁特旗| 凤阳县| 桓台县| 宜君县| 团风县| 新竹市| 屏东县| 镇坪县|