bytes
>>> type(b'xxxxx') <class 'bytes'> >>> type('xxxxx') <class 'str'>
bytes是byte的序列,而str是unicode的序列。
1、str 轉換成 bytes 用 encode() 方法:(注意:這有個坑,str1.encode不加括號和加括號是不一樣的,自己試試,初學貌似2.0不影響,3.0變了,不加括號開發環境語法不報錯)
str = '人生苦短,我用Python!' bytes = str.encode() print(bytes)
輸出:
b'\xe4\xba\xba\xe7\x94\x9f\xe8\x8b\xa6\xe7\x9f\xad\xef\xbc\x8c\xe6\x88\x91\xe7\x94\xa8Python!'
2、好了,反轉換 decode() :
bytes = b'\xe4\xba\xba\xe7\x94\x9f\xe8\x8b\xa6\xe7\x9f\xad\xef\xbc\x8c\xe6\x88\x91\xe7\x94\xa8Python!' str = bytes.decode() print(str)
輸出:
人生苦短,我用Python!
bytearray
1、bytearray和bytes不一樣的地方在於,bytearray是可變的。
str = '人生苦短,我用Python!' bytes = bytearray(str.encode()) bytes = bytearray(b'\xe4\xba\xba\xe7\x94\x9f\xe8\x8b\xa6\xe7\x9f\xad\xef\xbc\x8c\xe6\x88\x91\xe7\x94\xa8Python!') str = bytes.decode() print(str)
輸出:
'人生苦短,我用Python!'
2、改變bytearray
bytes[:6] = bytearray('生命'.encode()) bytes = bytearray(b'\xe7\x94\x9f\xe5\x91\xbd\xe8\x8b\xa6\xe7\x9f\xad\xef\xbc\x8c\xe6\x88\x91\xe7\x94\xa8Python!') str = bytes.decode() print(str)
輸出:
生命苦短,我用Python!
各種 bytes :
a = bytes('abc', 'utf-8') print(a) > b'abc' b = bytes(1) print(b) > b'\x00' c = bytes([2,3,6,8]) print(c) > b'\x02\x03\x06\x08' print(b"Python") > b'Python' python = (b'P' b'y' b"t" b'o' b'n') print(python) > b'Pyton'
Bytes 代表的是(二進制)數字的序列,只不過在是通過 ASCII
編碼之后才是我們看到的字符形式,如果我們單獨取出一個字節,它仍然是一個數字:
print(b"Python"[0])
> 80
我們可以用 b"*"
的形式創建一個字節類型,前提條件是這里的 *
必須是 ASCII
中可用的字符,否則將會超出限制:
print(b"雨") > File "", line 1 print(b"雨") ^ SyntaxError: bytes can only contain ASCII literal characters.
錯誤提示說明:字節類型只能允許 ASCII 字符(0~127~255)。ASCII
表里面所有的字符只占據了 [31, 127]
那對於這一范圍之外的數字我們要怎么才能表示為字節類型?答案就是用特殊的轉義符號x
+十六進制數字 :
print(b'xff'[0]) > 255 print(b'x24') > b'$'
反過來我們也可以將數字(0~255)轉變成轉義后的字節類型:
print(bytes([24]))
> b'x18' print(bytes([36,36,36])) # 記住字節類型是一個序列
或者直接從十六進制得來:
print(bytes.fromhex("7b 7d")) > b'{}'
# 逆運算 print(b'{ }'.hex())
> 7b207d int(b' '.hex(), base=16)
> 32
測試的一些代碼:
print("$".encode('ascii'))
> b'$' print("$".encode('ascii')[0])
> 36
ba = bytearray(b'hello')
ba[0:1] = b'w'
print(ba)
bytearray(b'wello')
可是如果我們對一些奇怪的字符進行 ASCII
編碼,就會發生異常:ordinal not in range(128)