14.Python bytes類型及用法


Python 3 新增了 bytes 類型,用於代表字節串(這是本教程創造的一個詞,用來和字符串對應)。字符串(str)由多個字符組成,以字符為單位進行操作;字節串(bytes)由多個字節組成,以字節為單位進行操作。

bytes 和 str 除操作的數據單元不同之外,它們支持的所有方法都基本相同,bytes 也是不可變序列。

bytes 對象只負責以字節(二進制格式)序列來記錄數據,至於這些數據到底表示什么內容,完全由程序決定。如果采用合適的字符集,字符串可以轉換成字節串;反過來,字節串也可以恢復成對應的字符串。

由於 bytes 保存的就是原始的字節(二進制格式)數據,因此 bytes 對象可用於在網絡上傳輸數據,也可用於存儲各種二進制格式的文件,比如圖片、音樂等文件。

如果希望將一個字符串轉換成 bytes 對象,有如下三種方式:

  1. 如果字符串內容都是 ASCII 字符,則可以通過直接在字符串之前添加 b 來構建字節串值。
  2. 調用 bytes() 函數(其實是 bytes 的構造方法)將字符串按指定字符集轉換成字節串,如果不指定字符集,默認使用 UTF-8 字符集。
  3. 調用字符串本身的 encode() 方法將字符串按指定字符集轉換成字節串,如果不指定字符集,默認使用 UTF-8 字符集。


例如,如下程序示范了如何創建字節串:

  1. # 創建一個空的bytes
  2. b1 = bytes()
  3. # 創建一個空的bytes值
  4. b2 = b''
  5. # 通過b前綴指定hello是bytes類型的值
  6. b3 = b'hello'
  7. print(b3)
  8. print(b3[0])
  9. print(b3[2:4])
  10. # 調用bytes方法將字符串轉成bytes對象
  11. b4 = bytes('我愛Python編程',encoding='utf-8')
  12. print(b4)
  13. # 利用字符串的encode()方法編碼成bytes,默認使用utf-8字符集
  14. b5 = "學習Python很有趣".encode('utf-8')
  15. print(b5)

上面程序中 b1~b5 都是字節串對象,該程序示范了以不同方式來構建字節串對象。其中 b2、b3 都是直接在 ASCII 字符串前添加b前綴來得到字節串的:b4 調用 bytes() 函數來構建字節串;而 b5 則調用字符串的 encode 方法來構建字節串。

運行上面程序,可以看到如下輸出結果:

b'hello'
104
b'll'
b'\xe6\x88\x91\xe7\x88\xb1Python\xe7\xbc\x96\xe7\xa8\x8b'
b'\xe5\xad\xa6\xe4\xb9\xa0Python\xe5\xbe\x88\xe6\x9c\x89\xe8\xb6\xa3'

從上面的輸出結果可以看出,字節串和字符串非常相似,只是字節串里的每個數據單元都是 1 字節。

計算機底層有兩個基本概念:位(bit)和字節(Byte),其中 bit 代表 1 位,要么是 0,要么是 1,就像一盞燈,要么打開,要么熄滅;Byte 代表 1 字節,1 字節包含 8 位。

在字節串中每個數據單元都是字節,也就是 8 位,其中每 4 位(相當於 4 位二進制數,最小值為 0 ,最大值為 15)可以用一個十六進制數來表示,因此每字節需要兩個十六進制數表示,所以可以看到上面的輸出是 b'\xe6\x88\x91\xe7\x88\xb1Python\xe7\xbc\x96\xe7\xa8\x8b',比如 \xe6 就表示 1 字節,其中 \x 表示十六進制,e6 就是兩位的十六進制數。

如果程序獲得了 bytes 對象,也可調用 bytes 對象的 decode() 方法將其解碼成字符串,例如,在上面程序中添加如下代碼:

  1. #將bytes 對象解碼成字符串,默認使用UTF-8進行解碼
  2. st = b5.decode('utf-8')
  3. print(st)#學習Python很有趣

運行上面程序,可以看到如下輸出結果:

學習Python很有趣

這里簡單介紹一下字符集的概念。計算機底層並不能保存字符,但程序總是需要保存各種字符的,那該怎么辦呢?計算機“科學家”就想了一個辦法:為每個字符編號,當程序要保存字符時,實際上保存的是該字符的編號;當程序讀取字符時,讀取的其實也是編號,接下來要去查“編號一字符對應表”(簡稱碼表)才能得到實際的字符。

因此,所謂的字符集,就是所有字符的編號組成的總和。早期美國人給英文字符、數字、標點符號等字符進行了編號,他們認為所有字符加起來頂多 100 多個,只要 1 字節(8 位,支持 256 個字符編號)即可為所有字符編號一一這就是 ASCII 字符集。

后來,亞洲國家紛紛為本國文字進行編號,即制訂本國的字符集,但這些字符集並不兼容。於是美國人又為世界上所有書面語言的字符進行了統一編號,這次他們用了兩個字節(16 位,支持 65536 個字符編號),這就是 Unicode 字符集。實際使用的 UTF-8, UTF-16 等其實都屬於 Unicode 字符集。

由於不同人對字符的編號完全可以很隨意,比如同一個“愛”字,我可以為其編號為 99,你可以為其編號為 199,所以同一個編號在不同字符集中代表的字符完全有可能是不同的。因此,對於同一個字符串,如果采用不同的字符集來生成 bytes 對象,就會得到不同的 bytes 對象。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM