chinese = bytes('englishENG中文', encoding='utf8')
print(chinese) # bytes可以通过构造函数传入str获得
# b'englishENG\xe4\xb8\xad\xe6\x96\x87'
print(chinese[0]) # 使用索引可以获得range(256)之间的整数
# 101
print(chinese[:1]) # bytes切片还是bytes对象,哪怕只有一个字节
# b'e'
chinese_arr = bytearray(chinese) # bytearray没有字面量
print(chinese_arr)
# bytearray(b'englishENG\xe4\xb8\xad\xe6\x96\x87')
print(chinese_arr[:1]) # bytearray的切片还是bytearray对象
# bytearray(b'e')
print(bytes.fromhex('31 4B CE A9')) # fromhex可以解析16进制数字,空格可选
# b'1K\xce\xa9'
numbers = array.array('h', [-2, -1, 0, 1, 2]) # h是占两个字节的有符号整型
octets = bytes(numbers)
print(octets)
# b'\xfe\xff\xff\xff\x00\x00\x01\x00\x02\x00'
1.通过结构体可以将字节序列转换成不同类型字段组成的元组或者反向转换。struct模块能处理bytes,bytearray,memoryview对象。 memoryview对象不是用于创建字节序列的而是共享内存,如PIL库就是这样处理的,不用复制字节序列了。
import struct
fmt = '<3s3sHH' # 结构体的格式,<是小字节序,3s3s是两个3字节序列,HH是两个16位二进制整数。
with open('7a.jpg', 'rb') as fp:
img = memoryview(fp.read())
# 使用缓冲类对象缓冲bytes或bytearray时始终复制对象中的字节序列,与之相反,memoryview允许共享内存
header = img[:10] # 使用切片会再创建一个memoryview对象,不会复制字节序列
print(bytes(header)) # 转换成字节序列为了显示,这里复制了10个字节。
# b'GIF89a\x00\x05\xd0\x02'
print(struct.unpack(fmt, header)) # 拆包memoryview对象,得到一个元组,包含类型、版本、宽度和高度。
# (b'GIF', b'89a', 1280, 720)
del header # 删除引用,释放memoryview实例所占的内存
del img
import chardet
print(chardet.detect(b))
# {'encoding': 'utf-8', 'confidence': 0.7525, 'language': ''}
chardetect dict_test.py
# dict_test.py: utf-8 with confidence 0.99
# locale.setlocale(locale.LC_COLLATE, 'zh_CN.UTF8')
fruits = ['苹果', '梨', '西瓜', '哈密瓜', '橘子', '香蕉', '葡萄', '桔子']
# sorted_fruits = sorted(fruits, key=locale.strxfrm)
for f in fruits:
print(f.encode('gbk'))
sorted_fruits = sorted(fruits, key=lambda s: s.encode('gbk', errors='ignore'))
print(sorted_fruits)
# ['哈密瓜', '桔子', '梨', '苹果', '葡萄', '西瓜', '香蕉', '橘子']
设置locale的办法在windows上经常得不到支持,蛋疼,退而求其次,可以使用gbk码表排序。