bytes、bytearray
- python3引入了兩個新類型
- bytes
- 不可變字節序列
- 可以簡單認為字節組成的列表
- bytearray
- 字節數組
- 可變
- bytes
字節組成的序列,字符串組成序列,有什么差異?
- 字符串以字符為單位
- 字節是以單個字節為單位,網絡傳輸時候,很重要
bytes不可變,所以出現了bytearray這種類型
字符串拼接,用‘+’效率不是很高,所以要用format,格式化字符串,format做了效率優化。
所有的數據,都能夠用bytes來處理。
python當中,最主要還是用bytes處理字符串
- 字符串與bytes
- 字符串是字符組成的有序列表,字符可以使用編碼來理解
- bytes是字節組成的,有序的,不可變序列
- bytearray是字節組成的,有序的,可變序列
- 編碼與解碼
- 字符串按照不同的字符集編碼encode返回字節序列bytes
- encode(encoding='utf-8',error='strict') - bytes - 不可變的
- 字節序列按照不同的字符集編碼decode返回字符串
- bytes.decode(encoding='utf-8',error='strict') - str
- bytearray.decode(encoding='utf-8',error='strict') - str
- 字符串按照不同的字符集編碼encode返回字節序列bytes
- gb2312、gbk都是2個字節上面玩
- unicode編碼,是多字節玩
- 內存中的數據,都是字節,你需要告訴內存,是什么編碼,才能找到數字對應的字符。
- linux默認編碼是utf-8,windows默認編碼是gbk
- linux回車換行符是\r\n,windows下面的回車換行符是\n
- 這是linux和windows對打字機的理解方式不一樣
- linux換行,自動到下一行,再回到頭。
- windows是先回到頭,再下來。
- 這就是大家對不同操作系統不同編碼的理解。
- 字符串的編碼,是可以理解的。
- 編碼無非就是一個編碼表,告訴你某一個數字和某一個字符之間的對應。
- 這些字符能夠顯示在屏幕上,要到字庫當中,找對應的點陣映射。
- 然后把點陣映射,映射到屏幕上的點陣上面。
- 列表封裝的比數組比較復雜。
- 列表的c語言源碼當中,封裝的其實,還是數組。
bytes定義
- 定義
- bytes()空bytes,沒用
- bytes(int) 指定字節的bytes,被0填充
- bytes(iterable_of_ints) -> bytes
[0,255]
的int組成的可迭代對象 bytes(string,encoding[,errors]) -> bytes
等價於string.encode()- bytes(bytes_or_buffer) -> immutable copy of bytes_or_buffer
- 從一個字節序列或者buffer復制出一個新的不可變的bytes對象
- 使用b前綴定義
- 只允許基本ASCII使用字符形式b'abc9'
- 使用16進制表示b"\x41\x61"
- 和str類型相似,都是不可變類型,所以方法很多都一樣。只不過bytes的方法,輸入是bytes,輸出是bytes
- b'abcdef'.replace(b'f',b'k')
- b'abc'.find(b'b')
- 類方法 bytes.fromhex(string)
- 類似於java和c++當中的靜態方法
- string必須是2個字符的16進制的形式,'6162 6a 6b',空格將被忽略
- bytes.fromhex('6162 09 6a 6b00')
- hex()
- 返回16進制表示的字符串
- 'abc'.encode().hex()
- 索引
b'abcdef'[2]
返回該字節對應的數,int類型。
有序的序列,一定可以索引和迭代
bytearray定義
- 定義
- bytearray()空bytes
- bytearray(int)指定字節的bytearray,被0填充
- bytearray(iterable_of_ints) -> bytearray
[0,255]
的int組成的可迭代對象 bytearray(string,encoding[,errors]) -> bytearray
近似string.encode() 不過返回可變對象- bytearray(bytes_or_buffer)從一個字節序列或者buffer復制出一個新的可變的bytearray對象
- 這個方法,可以將bytes轉變成為bytearray,消耗一次內存拷貝。
注意,b前綴定義的類型是bytes類型
buffer本身,就是一個bytearray
bytearray操作
- 和bytes類型的方法相同
- bytearray(b'abcdef').replace(b'f',b'k')
- bytearray(b'abc').find(b'b')
- 類方法 bytearray.fromhex(string)
- string必須是2個字符的16進制的形式,'6162 6a 6b',空格將被忽略
- bytearray.fromhex('6162 09 6a 6b00')
- hex()
- 返回16進制表示的字符串
- bytearray('abc'.encode()).hex()
- 索引
bytearray(b'abcdef')[2]
返回該字節對應的數,int類型
bytearray操作
-
append(int)尾部追加一個元素
-
insert(index,int)在指定索引位置插入元素
-
extend(iterable_of_ints)將一個可迭代的整數集合追加到當前bytearray
-
pop(index=-1)從指定索引上移除元素,默認從尾部移除
-
remove(value)找到第一個value移除,找不到拋ValueError異常
-
注意:上述方法若需要使用int類型,值在
[0,255]
-
clear() 清空bytearray
-
reverse() 翻轉bytearray,就地修改
-
b = bytearray()
-
b.append(97)
-
b.append(99)
-
b.insert(1,98)
-
b.extend([65,66,67])
-
b.remove(66) # 找不到拋出異常,一定要注意處理異常
-
b.pop
-
b.reverse()
-
b.clear()