精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Python高能小技巧:了解bytes與str的區別

開發 后端
Python有兩種類型可以表示字符序列:一種是bytes,另一種是str。

 [[388528]]

bytes實例包含的是原始數據,即8位的無符號值(通常按照ASCII編碼標準來顯示)。

 

  1. a = b'h\x65llo' 
  2. print(list(a)) 
  3. print(a) 
  4. >>> 
  5. [104, 101, 108, 108, 111] 
  6. b'hello' 

str實例包含的是Unicode碼點(code point,也叫作代碼點),這些碼點與人類語言之中的文本字符相對應。

 

  1. a = 'a\u0300 propos' 
  2. print(list(a)) 
  3. print(a) 
  4. >>> 
  5. ['a''`'' ''p''r''o''p''o''s'
  6. à propos 

 

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

  • 要把Unicode數據轉換成二進制數據,必須調用str的encode方法。
  • 要把二進制數據轉換成Unicode數據,必須調用bytes的decode方法。

調用這些方法的時候,可以明確指出自己要使用的編碼方案,也可以采用系統默認的方案,通常是指UTF-8(但有時也不一定,下面就會講到這個問題)。

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

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

兩種不同的字符類型與Python中兩種常見的使用情況相對應:

  • 開發者需要操作原始的8位值序列,序列里面的這些8位值合起來表示一個應該按UTF-8或其他標準編碼的字符串。
  • 開發者需要操作通用的Unicode字符串,而不是操作某種特定編碼的字符串。

我們通常需要編寫兩個輔助函數(helper function),以便在這兩種情況之間轉換,確保輸入值類型符合開發者的預期形式。

第一個輔助函數接受bytes或str實例,并返回str:

 

  1. def to_str(bytes_or_str): 
  2.     if isinstance(bytes_or_str, bytes): 
  3.         value = bytes_or_str.decode('utf-8'
  4.     else
  5.         value = bytes_or_str 
  6.     return value  # Instance of str 
  7.  
  8. print(repr(to_str(b'foo'))) 
  9. print(repr(to_str('bar'))) 
  10. >>> 
  11. 'foo' 
  12. 'bar' 

 

第二個輔助函數也接受bytes或str實例,但它返回的是bytes:

 

  1. def to_bytes(bytes_or_str): 
  2.     if isinstance(bytes_or_str, str): 
  3.         value = bytes_or_str.encode('utf-8'
  4.     else
  5.         value = bytes_or_str 
  6.     return value  # Instance of bytes 
  7.  
  8. print(repr(to_bytes(b'foo'))) 
  9. print(repr(to_bytes('bar'))) 

 

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

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

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

 

  1. print(b'one' + b'two'
  2. print('one' + 'two'
  3. >>> 
  4. b'onetwo' 
  5. onetwo 

 

但是不能將str實例添加到bytes實例:

 

  1. b'one' + 'two' 
  2. >>> 
  3. Traceback ... 
  4. TypeError: can't concat str to bytes 

 

也不能將bytes實例添加到str實例:

 

  1. 'one' + b'two' 
  2. >>> 
  3. Traceback ... 
  4. TypeError: can only concatenate str (not "bytes"to str 

 

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

 

  1. assert b'red' > b'blue' 
  2. assert 'red' > 'blue' 

 

但是str實例不能與bytes實例比較:

 

  1. assert 'red' > b'blue' 

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

 

  1. assert b'blue' < 'red' 

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

 

  1. print(b'foo' == 'foo'
  2. >>> 
  3. False 

 

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

 

  1. print(b'red %s' % b'blue'
  2. print('red %s' % 'blue'
  3. >>> 
  4. b'red blue' 
  5. red blue 

 

如果格式字符串是bytes類型,那么不能用str實例來替換其中的%s,因為Python不知道這個str應該按照什么方案來編碼。

 

  1. print(b'red %s' % 'blue'

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

 

  1. print('red %s' % b'blue'
  2. >>> 
  3. red b'blue' 

 

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

第二個問題發生在操作文件句柄的時候,這里的句柄指由內置的open函數返回的句柄。這樣的句柄默認需要使用Unicode字符串操作,而不能采用原始的bytes。習慣了Python 2的開發者,尤其容易碰到這個問題,進而導致程序出現奇怪的錯誤。例如,向文件寫入二進制數據的時候,下面這種寫法其實是錯誤的。

 

  1. with open('data.bin''w'as f: 
  2.     f.write(b'\xf1\xf2\xf3\xf4\xf5'
  3. >>> 
  4. Traceback ... 
  5. TypeError: write() argument must be str, not bytes 

 

程序發生異常是因為在調用open函數時,指定的是'w'模式,所以系統要求必須以文本模式寫入。如果想用二進制模式,那應該指定'wb'才對。在文本模式下,write方法接受的是包含Unicode數據的str實例,不是包含二進制數據的bytes實例。所以,我們得把模式改成'wb'來解決該問題。

 

  1. with open('data.bin''wb'as f: 
  2.     f.write(b'\xf1\xf2\xf3\xf4\xf5'

 

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

 

  1. with open('data.bin''r'as f: 
  2.     data = f.read() 

 

程序出錯,是因為在調用open函數時指定的是'r'模式,所以系統要求必須以文本模式來讀取。若要用二進制格式讀取,應該指定'rb'。以文本模式操縱句柄時,系統會采用默認的文本編碼方案處理二進制數據。

所以,上面那種寫法會讓系統通過bytes.decode把這份數據解碼成str字符串,再用str.encode把字符串編碼成二進制值。然而對于大多數系統來說,默認的文本編碼方案是UTF-8,所以系統很可能會把b'\xf1\xf2\xf3\xf4\xf5'當成UTF-8格式的字符串去解碼,于是就會出現上面那樣的錯誤。為了修正錯誤,需要把模式改成'rb'。

 

  1. with open('data.bin''rb'as f: 
  2.     data = f.read() 
  3.  
  4. assert data == b'\xf1\xf2\xf3\xf4\xf5' 

 

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

 

  1. with open('data.bin''r', encoding='cp1252'as f: 
  2.     data = f.read() 
  3.  
  4. assert data == 'ñòóôõ' 

 

這樣程序就不會出現異常了,但返回的字符串也與讀取原始字節數據所返回的有很大區別。通過這個例子,我們要提醒自己注意當前操作系統默認的編碼標準(可以執行 python3 -c 'import locale; print(

locale.getpreferredencoding())'命令查看),了解它與你所期望的是否一致。如果不確定,那就在調用open時明確指定encoding參數。

要點

  • bytes包含的是由8位值所組成的序列,str包含的是由Unicode碼點所組成的序列。
  • 我們可以編寫輔助函數來確保程序收到的字符序列確實是期望要操作的類型(要知道自己想操作的到底是Unicode碼點,還是原始的8位值。用UTF-8標準給字符串編碼,得到的就是這樣的一系列8位值)。
  • bytes與str這兩種實例不能在某些操作符(例如>、==、+、%操作符)上面混用。
  • 從文件中讀取二進制數據(或者把二進制數據寫入文件)時,應該用'rb'('wb')這樣的二進制模式打開文件。
  • 如果要從文件中讀取(或者要寫入文件之中)的是Unicode數據,那么必須注意系統默認的文本編碼方案。若無法肯定,可通過encoding參數明確指定。

 

 

責任編輯:華軒 來源: 今日頭條
相關推薦

2021-04-05 22:38:30

Python操作符代碼

2013-10-23 13:10:12

2018-09-17 16:30:24

數據庫MySQL小技巧

2020-08-31 10:48:11

MySQL數據庫數據庫技巧

2018-11-28 12:30:58

Python命令行編程語言

2015-09-08 17:22:03

小娜小冰微軟

2024-04-16 08:24:58

Python_str__()方法字符串

2016-08-05 15:33:26

Python編程異常

2011-09-01 15:22:16

Qt WebKitWebKit

2024-03-26 15:21:43

2024-04-17 09:01:08

Python深拷貝淺拷貝

2022-07-15 15:30:13

Python技巧

2021-05-07 16:02:54

Python代碼優化

2023-10-26 18:03:14

索引Python技巧

2021-06-16 10:50:16

Python代碼優化

2022-06-21 09:02:49

python技巧

2023-09-07 07:17:01

KubernetesCRI標準

2019-11-20 12:03:42

Python數據爬蟲

2017-01-16 15:12:36

Linuxwatch命令命令

2011-06-21 10:02:29

Python
點贊
收藏

51CTO技術棧公眾號

亚洲中文字幕无码av| 成人资源av| 国产美女精品久久| 欧美成人高清视频在线观看| 国产精品福利av| 成人影片在线播放| 国产免费一区二区三区四区五区| 日韩精品1区| 精品剧情在线观看| 亚洲精品乱码久久久久久自慰 | 麻豆成人免费电影| 久久久久久12| 欧美成人短视频| 国产精品超碰| 色香蕉久久蜜桃| 中文字幕精品在线播放| 美女毛片在线看| 麻豆中文一区二区| 91国内在线视频| 麻豆精品国产免费| 国产日韩欧美一区二区三区| 欧美一区二区成人| 久久久久国产一区| 中文字幕色婷婷在线视频| 亚洲色欲色欲www在线观看| 麻豆一区区三区四区产品精品蜜桃| 一本到在线视频| 美女黄网久久| 国内精品免费午夜毛片| 国产精品国产精品88| 色综合www| 亚洲成人av资源网| 丰满人妻一区二区三区53视频| 成人欧美大片| 精品久久香蕉国产线看观看亚洲| 桥本有菜av在线| 成人高清免费观看mv| 成人黄色综合网站| 114国产精品久久免费观看| 国产成人精品一区二区色戒| 在线亚洲精品| 久久久久久久久亚洲| 污软件在线观看| 久久影院100000精品| 一本色道久久综合狠狠躁篇怎么玩| 日韩精品一区二区三区高清免费| 亚洲精品一区二区三区在线| 制服丝袜亚洲精品中文字幕| 日本三级黄色网址| 日本肉肉一区| 欧美网站一区二区| 污污网站免费观看| 台湾天天综合人成在线| 欧美高清性hdvideosex| 九九热99视频| 色综合.com| 69精品人人人人| www.久久久久久久久久久| 亚洲精品三区| 欧美一级精品大片| 潘金莲一级淫片aaaaa| 日韩成人视屏| 亚洲福利视频免费观看| 水蜜桃av无码| 国产伦精品一区二区三区千人斩 | 日本在线免费中文字幕| 国产精品看片你懂得| 伊人色综合影院| 黄色网页在线播放| 亚洲综合在线第一页| 日韩成人中文电影| 国产精品自拍小视频| 色老头在线视频| 日本成人中文字幕在线视频 | 亚洲精品三区| 91精品国产综合久久精品app| 午夜激情影院在线观看| 亚洲图色一区二区三区| 亚洲第一中文字幕| 日韩乱码人妻无码中文字幕久久| 精品国产91久久久久久浪潮蜜月| 一区二区三区日韩在线| 久久av红桃一区二区禁漫| 中文字幕午夜精品一区二区三区| 欧美精品电影在线| 日本一区二区三区精品| 美女诱惑一区二区| 粉嫩av免费一区二区三区| 欧美特黄一级视频| 国产视频一区二区三区在线观看| 亚洲一卡二卡三卡| 黄色在线看片| 欧美中文字幕一区| 91精品人妻一区二区三区蜜桃2| 欧美日韩一区二区三区四区不卡| 在线播放日韩欧美| 国产在线拍揄自揄拍| 日韩和欧美一区二区| 99久热re在线精品996热视频| 亚洲av激情无码专区在线播放| 日本一区二区免费在线观看视频| a级黄色片免费| 欧美日韩成人影院| 精品国产乱子伦一区| 亚洲а∨天堂久久精品2021| 欧美成人69| 日韩av日韩在线观看| 国产aⅴ一区二区三区| 国产午夜精品理论片a级大结局| 亚洲人成网站在线播放2019| 91破解版在线观看| 91精品国产免费久久综合| 精品久久久久久中文字幕人妻最新| 欧美国产小视频| 97精品伊人久久久大香线蕉| 国产一区二区三区四区视频 | 日韩精品一区二区三区外面 | 欧美日韩视频在线| 精品国产午夜福利在线观看| 精品国产91| 91国内在线视频| 亚洲国产精品视频在线| 国产精品久久久久久久第一福利| 亚洲熟妇国产熟妇肥婆| 久久综合给合| www.久久撸.com| 波多野结衣不卡| 91免费观看国产| 国产无限制自拍| 试看120秒一区二区三区| 中文字幕一精品亚洲无线一区| 欧美bbbbbbbbbbbb精品| 成人免费黄色大片| 日b视频免费观看| 国产亚洲字幕| 美女福利视频一区| 国产精品无码AV| 国产精品久久久久久久久免费相片| 欧美日韩第二页| 综合亚洲自拍| 57pao成人国产永久免费| 深夜福利视频网站| 亚洲大片精品永久免费| 女人扒开腿免费视频app| 综合亚洲视频| 91视频婷婷| 日韩激情av| 精品女同一区二区| 国产性一乱一性一伧一色| 国产电影一区二区三区| 超级碰在线观看| 2020最新国产精品| 欧美极品欧美精品欧美视频| www.黄色av| 亚洲va韩国va欧美va| 国产精品扒开腿做爽爽爽a片唱戏| 国产一区清纯| 精品国产免费一区二区三区| 国产社区精品视频| 天堂蜜桃一区二区三区| 日韩在线精品视频| 亚洲最新av网站| 亚洲免费观看高清完整| 黄色片子免费看| 亚洲无毛电影| 久久婷婷开心| 日韩av首页| 精品国产一区二区三区四区在线观看 | 国内av免费观看| 黄色亚洲免费| 精品一区二区三区自拍图片区| 美女一区网站| 日韩中文字幕免费看| 精品人妻av一区二区三区| 亚洲午夜三级在线| 少妇按摩一区二区三区| 男人操女人的视频在线观看欧美| 宅男在线精品国产免费观看| 看亚洲a级一级毛片| 久久理论片午夜琪琪电影网| 青春有你2免费观看完整版在线播放高清| 日韩欧美国产网站| 精品少妇一区二区三区密爱| 国产91丝袜在线播放0| 国产中文字幕免费观看| 色777狠狠狠综合伊人| 99热在线国产| 中文字幕系列一区| 久久久噜噜噜久久中文字免| 暖暖视频在线免费观看| 欧美精品乱人伦久久久久久| 九九九国产视频| 中文在线一区二区| 日本久久久久久久久久| 日韩av一区二区三区四区| 日本高清xxxx| 九一成人免费视频| 99re6在线| 久久久人成影片一区二区三区在哪下载| 久久久999精品免费| 午夜国产在线观看| 91精品国产综合久久小美女| www亚洲视频| 樱桃国产成人精品视频| 中文字幕人妻一区二区三区在线视频| 国产精品一色哟哟哟| 欧在线一二三四区| 亚洲福利专区| 中文字幕一区二区三区精彩视频| 日韩高清成人在线| 91观看网站| 欧美一级免费| 日韩免费在线视频| 2021中文字幕在线| 超碰91人人草人人干| 高清国产福利在线观看| 亚洲精品久久在线| 亚洲av无码国产综合专区| 欧美日韩精品福利| 日韩在线播放中文字幕| 亚洲6080在线| 免费人成在线观看| 亚洲人123区| 麻豆视频免费在线播放| 久久亚洲欧美国产精品乐播| 性农村xxxxx小树林| 国产一本一道久久香蕉| 在线看的黄色网址| 日韩综合小视频| 99福利在线观看| 亚洲三级色网| 国产无限制自拍| 亚洲国产一区二区三区高清| 欧美一区二区三区综合| 亚洲综合色站| 免费成人进口网站| 久久精品青草| 青青草原国产免费| 色欧美自拍视频| 亚洲综合网中心| 97视频热人人精品免费| 色吧亚洲视频| 日本不卡高清| 在线成人av电影| 忘忧草精品久久久久久久高清| 亚洲精品一区二区毛豆| 日韩av有码| 一区二区三区欧美在线| 欧美xxxx中国| 亚洲欧美一二三| 欧美va天堂在线| 久久精品xxx| 亚洲每日更新| 六月婷婷在线视频| 亚洲一区欧美二区| 欧美一级片中文字幕| 日韩在线a电影| 免费看涩涩视频| 国内久久婷婷综合| 波多野吉衣在线视频| 国产成人h网站| 超碰男人的天堂| 国产亚洲欧美一级| 青青青手机在线视频| 亚洲日本在线a| 久久午夜鲁丝片午夜精品| 午夜激情久久久| 无码视频在线观看| 欧美丰满嫩嫩电影| 亚洲美女福利视频| 亚洲精品天天看| 秋霞成人影院| 九一亚洲精品| 麻豆亚洲一区| 国产精品久久久乱弄| 嫩草影院中文字幕| 校园春色综合网| 手机版av在线| 丁香六月久久综合狠狠色| av在线网站观看| 国产精品青草综合久久久久99| 少妇aaaaa| 岛国av一区二区三区| 亚洲视频在线观看一区二区| 日韩视频在线永久播放| 青梅竹马是消防员在线| 久久久成人av| 日本不卡1234视频| 国产乱肥老妇国产一区二| 成人在线视频你懂的| 日韩欧美精品一区二区| 午夜欧美精品| 欧美日韩大尺度| 国产福利91精品一区二区三区| 波多野吉衣中文字幕| 亚洲精品亚洲人成人网| 亚洲va在线观看| 日韩一区二区高清| 福利片在线看| 韩国三级日本三级少妇99| 日韩黄色三级在线观看| 精品亚洲一区二区三区四区五区高| 俺要去色综合狠狠| 成人毛片一区二区| 国产资源在线一区| 91成人在线免费视频| 亚洲综合一二区| 一区二区三区午夜| 亚洲男女自偷自拍图片另类| 图片区小说区亚洲| 国产欧美在线播放| 亚洲丁香日韩| www.av蜜桃| 国产精品原创巨作av| 精品无码在线观看| 精品色蜜蜜精品视频在线观看| av小说天堂网| 日韩一级黄色av| 欧美性理论片在线观看片免费 | 久久夜色精品国产噜噜av小说| 亚洲综合欧美日韩| 青青草视频一区| 人人妻人人藻人人爽欧美一区| 亚洲国产精品一区二区www在线| 夜夜躁狠狠躁日日躁av| 在线播放国产一区中文字幕剧情欧美| 天堂av在线网| 韩日午夜在线资源一区二区| 欧美日本一区二区视频在线观看| 日本不卡一区二区在线观看| 久久精品视频在线看| 美日韩一二三区| 亚洲黄色av网站| 国产高清自产拍av在线| 国产成人亚洲欧美| 欧美精品网站| 熟女人妻一区二区三区免费看| 自拍偷拍亚洲欧美日韩| 一区二区久久精品66国产精品| 中文字幕精品久久| 国产精品xxx| 亚洲一区二区三区涩| 免费黄网站欧美| 欧美日韩生活片| 欧美日韩国产高清一区二区三区| av黄色在线观看| 国产精品丝袜白浆摸在线| 欧美丝袜丝交足nylons172| 啊啊啊国产视频| 中文字幕第一区综合| 在线视频播放大全| www日韩中文字幕在线看| 四虎精品在线观看| 五月天激情图片| 成人午夜激情影院| 99热国产在线观看| 亚洲国产精品久久| 在线黄色的网站| 水蜜桃一区二区| 加勒比av一区二区| 免费无码毛片一区二区app| 精品捆绑美女sm三区| 悠悠资源网亚洲青| 欧美一区二区三区在线播放| 欧美a级理论片| 日韩激情小视频| 精品国产乱码久久久久久闺蜜| 2001个疯子在线观看| 久久精品成人一区二区三区蜜臀 | 国产999精品| 99视频精品全国免费| 日本成人在线免费| 大伊人狠狠躁夜夜躁av一区| 国产在线一在线二| 91精品在线国产| 亚洲全部视频| 日韩视频在线观看免费视频| 91精品国产综合久久婷婷香蕉| 国产高清视频色在线www| 亚洲 国产 日韩 综合一区| 国产精品夜夜爽| 久久久久99精品成人片我成大片 | 久久精品国产精品国产精品污 | 中文字幕人成人乱码| 欧美 变态 另类 人妖| 欧美网站大全在线观看| 色图在线观看| 日韩av电影免费在线| 国产高清久久久| 免费无码国产精品| 精品国产一区二区三区久久久| 嫩草国产精品入口| 亚洲 国产 图片| 精品国产成人在线| 麻豆影院在线| 久久香蕉综合色| 国产成人一级电影| 亚洲精品无码久久久久| 欧美激情在线播放| 日韩理论电影大全|