黄视频网站在线免费观看-黄视频网站在线看-黄视频网站在线观看-黄视频网站免费看-黄视频网站免费观看-黄视频网站免费

千鋒教育-做有情懷、有良心、有品質(zhì)的職業(yè)教育機(jī)構(gòu)

手機(jī)站
千鋒教育

千鋒學(xué)習(xí)站 | 隨時(shí)隨地免費(fèi)學(xué)

千鋒教育

掃一掃進(jìn)入千鋒手機(jī)站

領(lǐng)取全套視頻
千鋒教育

關(guān)注千鋒學(xué)習(xí)站小程序
隨時(shí)隨地免費(fèi)學(xué)習(xí)課程

當(dāng)前位置:首頁  >  技術(shù)干貨  > 如何理解Python中bytes與str的區(qū)別

如何理解Python中bytes與str的區(qū)別

來源:千鋒教育
發(fā)布人:xqq
時(shí)間: 2023-11-05 21:50:38 1699192238

bytes實(shí)例包含的是原始數(shù)據(jù),即8位的無符號(hào)值(通常按照ASCII編碼標(biāo)準(zhǔn)來顯示)。

a=b'hello'print(list(a))print(a)>>>[104,101,108,108,111]b'hello'

str實(shí)例包含的是Unicode碼點(diǎn)(codepoint,也叫作代碼點(diǎn)),這些碼點(diǎn)與人類語言之中的文本字符相對(duì)應(yīng)。

a='au0300propos'print(list(a))print(a)>>>['a','`','','p','r','o','p','o','s']àpropos

大家一定要記住:str實(shí)例不一定非要用某一種固定的方案編碼成二進(jìn)制數(shù)據(jù),bytes實(shí)例也不一定非要按照某一種固定的方案解碼成字符串。

要把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(但有時(shí)也不一定,下面就會(huì)講到這個(gè)問題)。

編寫Python程序的時(shí)候,一定要把解碼和編碼操作放在界面最外層來做,讓程序的核心部分可以使用Unicode數(shù)據(jù)來運(yùn)作,這種辦法通常叫作Unicode三明治(Unicodesandwich)。程序的核心部分,應(yīng)該用str類型來表示Unicode數(shù)據(jù),并且不要鎖定到某種字符編碼上面。

這樣可以讓程序接受許多種文本編碼(例如Latin-1、ShiftJIS及Big5),并把它們都轉(zhuǎn)化成Unicode,也能保證輸出的文本信息都是用同一種標(biāo)準(zhǔn)(最好是UTF-8)編碼的。

兩種不同的字符類型與Python中兩種常見的使用情況相對(duì)應(yīng):

開發(fā)者需要操作原始的8位值序列,序列里面的這些8位值合起來表示一個(gè)應(yīng)該按UTF-8或其他標(biāo)準(zhǔn)編碼的字符串。

開發(fā)者需要操作通用的Unicode字符串,而不是操作某種特定編碼的字符串。

我們通常需要編寫兩個(gè)輔助函數(shù)(helperfunction),以便在這兩種情況之間轉(zhuǎn)換,確保輸入值類型符合開發(fā)者的預(yù)期形式。

第一個(gè)輔助函數(shù)接受bytes或str實(shí)例,并返回str:

defto_str(bytes_or_str):ifisinstance(bytes_or_str,bytes):value=bytes_or_str.decode('utf-8')else:value=bytes_or_strreturnvalue#Instanceofstrprint(repr(to_str(b'foo')))print(repr(to_str('bar')))>>>'foo''bar'

第二個(gè)輔助函數(shù)也接受bytes或str實(shí)例,但它返回的是bytes:

defto_bytes(bytes_or_str):ifisinstance(bytes_or_str,str):value=bytes_or_str.encode('utf-8')else:value=bytes_or_strreturnvalue#Instanceofbytesprint(repr(to_bytes(b'foo')))print(repr(to_bytes('bar')))

在Python中使用原始的8位值與Unicode字符串時(shí),有兩個(gè)問題要注意。

第一個(gè)問題是,bytes與str這兩種類型似乎是以相同的方式工作的,但其實(shí)例并不相互兼容,所以在傳遞字符序列的時(shí)候必須考慮好其類型。

可以用+操作符將bytes添加到bytes,str也可以這樣。

print(b'one'+b'two')print('one'+'two')>>>b'onetwo'onetwo

但是不能將str實(shí)例添加到bytes實(shí)例:

b'one'+'two'>>>Traceback...TypeError:can'tconcatstrtobytes

也不能將bytes實(shí)例添加到str實(shí)例:

'one'+b'two'>>>Traceback...TypeError:canonlyconcatenatestr(not"bytes")tostr

bytes與bytes之間可以用二元操作符(binaryoperator)來比較大小,str與str之間也可以:

assertb'red'>b'blue'assert'red'>'blue'

但是str實(shí)例不能與bytes實(shí)例比較:

assert'red'>b'blue'

反過來也一樣,也就是說bytes實(shí)例不能與str實(shí)例比較:

assertb'blue'<'red'

判斷bytes與str實(shí)例是否相等,總是會(huì)評(píng)估為假(False),即便這兩個(gè)實(shí)例表示的字符完全相同,它們也不相等。例如,在下面這個(gè)例子里,它們表示的字符串都相當(dāng)于ASCII編碼之中的foo。

print(b'foo'=='foo')>>>False

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

print(b'red%s'%b'blue')print('red%s'%'blue')>>>b'redblue'redblue

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

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

但反過來卻可以,也就是說如果格式字符串是str類型,則可以用bytes實(shí)例來替換其中的%s,問題是,這可能跟你想要的結(jié)果不一樣。

print('red%s'%b'blue')>>>redb'blue'

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

第二個(gè)問題發(fā)生在操作文件句柄的時(shí)候,這里的句柄指由內(nèi)置的open函數(shù)返回的句柄。這樣的句柄默認(rèn)需要使用Unicode字符串操作,而不能采用原始的bytes。習(xí)慣了Python2的開發(fā)者,尤其容易碰到這個(gè)問題,進(jìn)而導(dǎo)致程序出現(xiàn)奇怪的錯(cuò)誤。例如,向文件寫入二進(jìn)制數(shù)據(jù)的時(shí)候,下面這種寫法其實(shí)是錯(cuò)誤的。

withopen('data.bin','w')asf:f.write(b'?????')>>>Traceback...TypeError:write()argumentmustbestr,notbytes

程序發(fā)生異常是因?yàn)樵谡{(diào)用open函數(shù)時(shí),指定的是'w'模式,所以系統(tǒng)要求必須以文本模式寫入。如果想用二進(jìn)制模式,那應(yīng)該指定'wb'才對(duì)。在文本模式下,write方法接受的是包含Unicode數(shù)據(jù)的str實(shí)例,不是包含二進(jìn)制數(shù)據(jù)的bytes實(shí)例。所以,我們得把模式改成'wb'來解決該問題。

withopen('data.bin','wb')asf:f.write(b'?????')

讀取文件的時(shí)候也有類似的問題。例如,如果要把剛才寫入的二進(jìn)制文件讀出來,那么不能用下面這種寫法。

withopen('data.bin','r')asf:data=f.read()

程序出錯(cuò),是因?yàn)樵谡{(diào)用open函數(shù)時(shí)指定的是'r'模式,所以系統(tǒng)要求必須以文本模式來讀取。若要用二進(jìn)制格式讀取,應(yīng)該指定'rb'。以文本模式操縱句柄時(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'?????'當(dāng)成UTF-8格式的字符串去解碼,于是就會(huì)出現(xiàn)上面那樣的錯(cuò)誤。為了修正錯(cuò)誤,需要把模式改成'rb'。

withopen('data.bin','rb')asf:data=f.read()assertdata==b'?????'

另一種改法是在調(diào)用open函數(shù)的時(shí)候,通過encoding參數(shù)明確指定編碼標(biāo)準(zhǔn),以確保平臺(tái)特有的一些行為不會(huì)干擾代碼的運(yùn)行效果。例如,假設(shè)剛才寫到文件里的那些二進(jìn)制數(shù)據(jù)表示的是一個(gè)采用'cp1252'標(biāo)準(zhǔn)(cp1252是一種老式的Windows編碼方案)來編碼的字符串,則可以這樣寫:

withopen('data.bin','r',encoding='cp1252')asf:data=f.read()assertdata=='?òó??'

這樣程序就不會(huì)出現(xiàn)異常了,但返回的字符串也與讀取原始字節(jié)數(shù)據(jù)所返回的有很大區(qū)別。通過這個(gè)例子,我們要提醒自己注意當(dāng)前操作系統(tǒng)默認(rèn)的編碼標(biāo)準(zhǔn)(可以執(zhí)行python3-c'importlocale;print(locale.getpreferredencoding())'命令查看),了解它與你所期望的是否一致。如果不確定,那就在調(diào)用open時(shí)明確指定encoding參數(shù)。

要點(diǎn)

bytes包含的是由8位值所組成的序列,str包含的是由Unicode碼點(diǎn)所組成的序列。

我們可以編寫輔助函數(shù)來確保程序收到的字符序列確實(shí)是期望要操作的類型(要知道自己想操作的到底是Unicode碼點(diǎn),還是原始的8位值。用UTF-8標(biāo)準(zhǔn)給字符串編碼,得到的就是這樣的一系列8位值)。

bytes與str這兩種實(shí)例不能在某些操作符(例如>、==、+、%操作符)上面混用。

從文件中讀取二進(jìn)制數(shù)據(jù)(或者把二進(jìn)制數(shù)據(jù)寫入文件)時(shí),應(yīng)該用'rb'('wb')這樣的二進(jìn)制模式打開文件。

如果要從文件中讀取(或者要寫入文件之中)的是Unicode數(shù)據(jù),那么必須注意系統(tǒng)默認(rèn)的文本編碼方案。若無法肯定,可通過encoding參數(shù)明確指定。

以上內(nèi)容為大家介紹了如何理解Python中bytes與str的區(qū)別,希望對(duì)大家有所幫助,如果想要了解更多Python相關(guān)知識(shí),請(qǐng)關(guān)注IT培訓(xùn)機(jī)構(gòu):千鋒教育。http://www.e7g2kmi.cn/

聲明:本站稿件版權(quán)均屬千鋒教育所有,未經(jīng)許可不得擅自轉(zhuǎn)載。
10年以上業(yè)內(nèi)強(qiáng)師集結(jié),手把手帶你蛻變精英
請(qǐng)您保持通訊暢通,專屬學(xué)習(xí)老師24小時(shí)內(nèi)將與您1V1溝通
免費(fèi)領(lǐng)取
今日已有369人領(lǐng)取成功
劉同學(xué) 138****2860 剛剛成功領(lǐng)取
王同學(xué) 131****2015 剛剛成功領(lǐng)取
張同學(xué) 133****4652 剛剛成功領(lǐng)取
李同學(xué) 135****8607 剛剛成功領(lǐng)取
楊同學(xué) 132****5667 剛剛成功領(lǐng)取
岳同學(xué) 134****6652 剛剛成功領(lǐng)取
梁同學(xué) 157****2950 剛剛成功領(lǐng)取
劉同學(xué) 189****1015 剛剛成功領(lǐng)取
張同學(xué) 155****4678 剛剛成功領(lǐng)取
鄒同學(xué) 139****2907 剛剛成功領(lǐng)取
董同學(xué) 138****2867 剛剛成功領(lǐng)取
周同學(xué) 136****3602 剛剛成功領(lǐng)取
相關(guān)推薦HOT
Python標(biāo)準(zhǔn)庫主要有哪些功能?

眾所周知,Python標(biāo)準(zhǔn)庫非常龐大,可以幫助處理各種各樣的工作,從而提高效率、節(jié)省成本。那么你對(duì)Python標(biāo)準(zhǔn)庫了解多少呢?你知道Python標(biāo)準(zhǔn)庫...詳情>>

2023-11-05 23:38:38
用Python編寫代碼時(shí)有哪些有用的技巧?

不知道吧,使用Python編寫代碼時(shí),有一些小技巧可以大幅度提升我們的工作效率和開發(fā)效率,而且這些技巧很簡(jiǎn)單,只需要在編寫代碼時(shí)稍微注意一下...詳情>>

2023-11-05 22:48:14
python基礎(chǔ)入門之設(shè)計(jì)URL方案

DjangoURL分發(fā)系統(tǒng)使用了正則表達(dá)式配置模塊,它可以將URL字符串模式映射為Python方法views。這個(gè)系統(tǒng)允許URL與底層代碼完全脫節(jié),從而實(shí)現(xiàn)最大...詳情>>

2023-11-05 22:37:26
Python的編程語言

一、Python編程語言的優(yōu)點(diǎn)有哪些?1.Python是一種腳本語言,寫好了就可以直接運(yùn)行,省去了編譯鏈接的麻煩,對(duì)于需要多動(dòng)手實(shí)踐的初學(xué)者而言,也...詳情>>

2023-11-05 22:33:50
python五大異常處理機(jī)制

??我們明白了什么是異常后,那么發(fā)現(xiàn)異常后怎么處理,便是我們接下來要解決的問題。這里將處理異常的方式總結(jié)為五種。1、默認(rèn)異常處理機(jī)制“...詳情>>

2023-11-05 22:15:50
国产亚洲免费观看| 台湾美女古装一级毛片| 亚州视频一区二区| 九九精品在线播放| 欧美激情一区二区三区视频 | 精品久久久久久中文字幕2017| 91麻豆国产福利精品| 九九热国产视频| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 在线观看成人网 | 日本免费乱人伦在线观看 | 成人免费一级纶理片| 精品国产一区二区三区免费| a级毛片免费全部播放| 色综合久久天天综合观看| 日本在线www| 日韩免费在线视频| 人人干人人插| 欧美激情中文字幕一区二区| 四虎影视久久久免费| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 精品视频一区二区| 久久国产精品自由自在| 尤物视频网站在线观看| 日韩欧美一二三区| 色综合久久天天综合| 亚久久伊人精品青青草原2020| 精品视频免费在线| 99久久精品国产免费| 欧美激情一区二区三区在线| 欧美激情一区二区三区在线| 美女免费精品高清毛片在线视| 四虎影视库国产精品一区| 国产伦精品一区二区三区无广告| 沈樵在线观看福利| 久久99爰这里有精品国产| 久久99中文字幕| 91麻豆国产| 午夜激情视频在线播放| 国产精品1024永久免费视频| 免费国产一级特黄aa大片在线| 久久精品大片| 亚洲第一视频在线播放| 精品久久久久久影院免费| 国产成人精品综合在线| 久久精品欧美一区二区| 日韩在线观看视频黄| 黄色短视屏| 九九精品久久久久久久久| 欧美一区二区三区在线观看| 精品视频在线观看视频免费视频| 日韩一级精品视频在线观看| 国产成人精品在线| 黄色福利片| 成人免费观看视频| 日韩avdvd| 日韩在线观看免费| 亚洲 欧美 成人日韩| 免费国产在线观看不卡| 亚洲 男人 天堂| 精品久久久久久中文字幕一区| 日韩中文字幕一区二区不卡| 欧美另类videosbestsex| 毛片高清| 色综合久久天天综合观看| 国产成人精品影视| 日本伦理网站| 亚洲精品久久久中文字| 青青久热| 国产一区二区精品久| 中文字幕一区二区三区精彩视频| 亚洲精品影院久久久久久| 精品国产一区二区三区免费| 韩国三级香港三级日本三级| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 免费一级生活片| 成人免费福利片在线观看| 国产一区免费观看| 青青青草影院 | 天天做日日爱| 999精品影视在线观看| 精品国产一级毛片| 精品视频在线观看视频免费视频 | 91麻豆国产福利精品| 韩国三级香港三级日本三级| 国产激情视频在线观看| 欧美国产日韩一区二区三区| 日韩一级黄色大片| 国产一区二区精品在线观看| 日本伦理网站| 日本在线www| 亚洲天堂在线播放| 成人免费一级纶理片| 日本在线www| 91麻豆tv| 黄视频网站免费| 韩国三级视频在线观看| 国产91素人搭讪系列天堂| 一级女性全黄生活片免费| 国产高清在线精品一区二区 | 韩国三级香港三级日本三级| 韩国三级视频在线观看| 亚洲 激情| 亚洲第一页乱| 欧美激情一区二区三区视频高清| 久久久成人网| 精品国产三级a| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 国产麻豆精品视频| 欧美另类videosbestsex久久| 久久精品免视看国产明星| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 国产视频一区二区在线观看| 99热精品在线| 91麻豆精品国产片在线观看| 91麻豆精品国产片在线观看| 可以免费看污视频的网站| 精品国产一区二区三区久| 午夜家庭影院| 亚洲天堂在线播放| 久久国产影院| 国产91精品一区| 中文字幕97| 国产成人啪精品| 亚洲天堂一区二区三区四区| 青青久久精品国产免费看| 99热精品在线| 日韩avdvd| 久草免费资源| 成人在激情在线视频| 免费国产一级特黄aa大片在线| 免费一级生活片| 四虎影视精品永久免费网站| 四虎影视库国产精品一区| 国产亚洲免费观看| 天堂网中文字幕| 免费一级片网站| 91麻豆精品国产自产在线观看一区 | 国产高清在线精品一区二区| 成人在激情在线视频| 欧美a级v片不卡在线观看| 久久久成人网| 亚洲不卡一区二区三区在线| 成人av在线播放| 日本免费看视频| 成人a级高清视频在线观看| 一级片免费在线观看视频| 超级乱淫黄漫画免费| 美国一区二区三区| 国产一级生活片| 国产精品自拍在线观看| 久久久久久久男人的天堂| 九九九网站| 亚洲精品久久久中文字| a级黄色毛片免费播放视频| 精品视频在线观看一区二区三区| 久久99爰这里有精品国产| 国产精品免费久久| 精品在线视频播放| 欧美激情一区二区三区中文字幕| 免费一级片在线| 国产成人啪精品| 国产一区二区精品| 中文字幕97| 999久久狠狠免费精品| 九九国产| 亚洲 欧美 成人日韩| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 久久成人亚洲| 九九九在线视频| 成人高清视频在线观看| 精品久久久久久免费影院| 欧美激情一区二区三区中文字幕| 四虎影视库| 成人影视在线播放| 日本免费看视频| 国产不卡在线看| 欧美另类videosbestsex高清 | 成人在免费观看视频国产| 久久国产一区二区| 久久国产精品只做精品| 亚洲女人国产香蕉久久精品| 亚洲 国产精品 日韩| 成人高清视频在线观看| 999久久66久6只有精品| 国产精品免费精品自在线观看| 美女被草网站| 久久久成人网| 欧美激情中文字幕一区二区| 欧美日本二区| 国产伦久视频免费观看视频| 天天做人人爱夜夜爽2020 | 国产亚洲精品aaa大片| 精品视频在线看| 欧美一级视频免费观看| 精品国产香蕉伊思人在线又爽又黄| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 欧美大片a一级毛片视频| 精品久久久久久综合网| 国产网站免费|