Python-字节总结(bytes、bytearray、⽅法、内置函数、模
块)
⽬录
bytes-不可变的字节序列
表⽰ bytes 字⾯值的语法与字符串字⾯值的⼤致相同,只是添加了⼀个 b 前缀:
单引号: b'允许嵌⼊ "双" 引号'。
双引号: b"允许嵌⼊ '单' 引号"。
三重引号: b'''三重单引号''', b"""三重双引号"""
创建与赋值
>>> bt = b'\x01\x00\x00\x08'
>>> bt
b'\x01\x00\x00\x08'
操作符
访问(序列操作符切⽚)
想来在看本⽂之前,你已经看了,切⽚应该已经会了,不再重复理论,直接演⽰。
字节序列下标
>=0时的index0123
bytes(⼗六进制)01000008
<0时的index-4-3-2-1
>>> bt[0]
1
>>> bt[0:3]
b'\x01\x00\x00'
>>> bt[0:4:2]
b'\x01\x00'
>>> bt[::-1]
b'\x08\x00\x00\x01'
判断⼦序列(成员操作符in、not in)
>>> b'\x00' in bt
True
>>> b'\x01' not in bt
False
拼接(操作符+)
>>> bt + b'\xff'
b'\x01\x00\x00\x08\xff'
重复(操作符*)
>>> bt * 2
b'\x01\x00\x00\x08\x01\x00\x00\x08'
⽐较(操作符==、!=、<、=<、>、>=)
>>> bt == bt
True
>>> bt != bt
False
>>> bt < bt[0:3] + b'\x10'
True
>>> bt <= bt
True
>>> bt > bt
False
>>> bt >= bt[0]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: '>=' not supported between instances of 'bytes' and 'int' >>> bt >= bt[0:2]
True
注意,bytes类型使⽤切⽚为⼀个时,类型会变为int,需要转换。
>>> type(bt[3])
<class 'int'>
>>> bt >= bytes(bt[0])
True
删除
关键字del, del 变量名
>>> del bt
>>> bt
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'bt' is not defined
⽅法
对⽐⼀下字符串(删除了__*__)。
>>> dir(str)
['capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isascii', 'isdecimal', 'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines',
'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']
>>> dir(bytes)
[ 'capitalize', 'center', 'count', 'decode', 'endswith', 'expandtabs', 'find', 'fromhex', 'hex', 'index', 'isalnum', 'isalpha', 'isascii', 'isdigit', 'islower', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']
⽅法与字符串类似,只不过参数变为了字节
>>> b'lady_killer9'.replace(b'l',b'L')
b'Lady_kiLLer9'
其余常见⽅法可查看,接下来展⽰不⼀样的。
⼗六进制
fromhex(str)
此bytes类⽅法返回⼀个解码给定字符串的 bytes 对象。 字符串必须由表⽰每个字节的两个⼗六进制数码构成,其中的 空⽩符会被忽略。hex()
返回⼀个字符串对象,该对象包含实例中每个字节的两个⼗六进制数字。
>>> bt = bytes.fromhex('01000008')
>>> bt
b'\x01\x00\x00\x08'
>>> bt.hex()
'01000008'
解码
decode(self, /, encoding='utf-8', errors='strict')
>>> bt.decode(encoding='ascii')
'\x01\x00\x00\x08'
内置函数
class bytes([source[, encoding[, errors]]])
bytes 字⾯值中只允许 (⽆论源代码声明的编码为何)。 任何超出 127 的⼆进制值必须使⽤相应的转义序列形式加⼊ bytes 字⾯值。像字符串字⾯值⼀样,bytes 字⾯值也可以使⽤ r 前缀来禁⽤转义序列处理。
虽然 bytes 字⾯值和表⽰法是基于 ASCII ⽂本的,但 bytes 对象的⾏为实际上更像是不可变的整数序列,序列中的每个值的⼤⼩被限制为0 <= x < 256 (如果违反此限制将引发ValueError)。
除了字⾯值形式,bytes 对象还可以通过其他⼏种⽅式来创建:
指定长度的以零值填充的 bytes 对象: bytes(10)
通过由整数组成的可迭代对象: bytes(range(20))
通过缓冲区协议复制现有的⼆进制数据: bytes(obj)
模块
struct
将字节串解读为打包的⼆进制数据,读过⼀些协议相关的部分代码,⾥⾯就有这个。
bytearray-可变的字节序列
创建
class bytearray([source[, encoding[, errors]]])
bytearray 对象没有专属的字⾯值语法,它们总是通过调⽤构造器来创建:
创建⼀个空实例: bytearray()
创建⼀个指定长度的以零值填充的实例: bytearray(10)
通过由整数组成的可迭代对象: bytearray(range(20))
通过缓冲区协议复制现有的⼆进制数据: bytearray(b'Hi!')
由于 bytearray 对象是可变的,还⽀持序列操作。与byte相同的不再重复。
⽅法
isalpha 函数>>> dir(bytes)
[ 'capitalize', 'center', 'count', 'decode', 'endswith', 'expandtabs', 'find', 'fromhex', 'hex', 'index', 'isalnum', 'isalpha', 'isascii', 'isdigit', 'islower', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']
>>> dir(bytearray)
['append', 'capitalize', 'center', 'clear', 'copy', 'count', 'decode', 'endswith', 'expandtabs', 'extend', 'find', 'fromhex', 'hex', 'index', 'insert', 'isalnum', 'isalpha', 'isascii', 'isdigit', 'islower', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip',
'maketrans', 'partition', 'pop', 'remove', 'replace', 'reverse', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']
添加
append(item)
在后⾯添加⼀个对象(整数),⾮整数时TypeError。
>>> bt = b'01000008'
>>> bta = bytearray(bt)
>>> bta
bytearray(b'01000008')
>>> bta.append('lady_killer9')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'str' object cannot be interpreted as an integer
>>> bta.append(30)
>>> bta
bytearray(b'01000008\x1e')
extend(iterable_of_ints)
将⼀个全是int的可迭代对象依次添加到后⾯,可能效率⽐for循环+append要⾼,不然官⽅应该也不会加。
>>> bte = bytearray()
>>> lst = [i for i in range(65,75)]
>>> d(lst)
>>> bte
bytearray(b'ABCDEFGHIJ')
复制
copy()
返回⼀个拷贝后的bytearray对象,id不同。
>>> id(bta)
1829219244656
>>> bta_copy = py()
>>> bta_copy
bytearray(b'01000008\x1e')
>>> id(bta_copy)
1829219048752
删除
pop(index=-1)。
index是索引,会删除的那个字节,默认-1即最后⼀个字节。
返回删除的那个字节对应的整数。
>>> bta.pop()
30
>>> bta
bytearray(b'01000008')
>>> bta.append(65)
>>> bta
bytearray(b'01000008A')
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论