python中的字符与字节
- 字符和Unicode字符是什么,怎么表示
- 什么字符的编码和解码
- python中有什么字节类型
- 如何创建字节
- 字节有哪些方法何应用
python中字符的定义
字符的基础概念
**字符串:**由字符组成的序列
什么是字符呢?
字符: python中的定义是Unicode字符,
- 在python3中,str对象中获取的元素是Unicode字符
- 在python2中,str对象中获取的原始字节序列
Unicode字符
字符的标识(码位)
是 0~1 114 111 的数字(十进制),在 Unicode 标准中以 4~6 个十六进制数字表示,而且加前缀“U+”。
例如:字母A的码位是*U+0041,约 10% 的有效码位有对应的字符
字符的具体表述(编码)
编码是在码位和字节序列之间转换时使用的算法,有不同的编码算法,如: UTF-8,UTF-16LE.
例如 A的码位编成单个字节:\x41
(UTF-8),\41\x00
(UTF-16LE)
编码:把码位转换成字节序列的过程,把人类可读的文本字符串转换成机器可存储或传输的过程
解码:把字节序列转换成码位的过程,把机器码转换成人类可读的文本字符串的过程
# 定义一个字符串
s = 'café'
print(len(s))
# 将字符串编码
b = s.encode('utf8')
# “é”的码位编码成两个字节
print(b)
print(len(b))
# 将字符串解码
c = b.decode('utf8')
print(c)
d = '中国'
e = d.encode('utf8')
print(e)
print(len(e))
4
b'caf\xc3\xa9'
5
café
b'\xe4\xb8\xad\xe5\x9b\xbd'
6
字节的概念
bytes 与 bytearray
Python两种基本的二进制序列类型:
- bytes:不可变类型
- bytearray:可变类型
python3中,它们对象的各个元素是介于 0~255(含)之间的整数,二进制序列的切片始终是同一类型的二进制序列.
虽然二进制序列其实是整数序列,但是它们的字面量表示法表明其中有 ASCII 文本.
各个字节的显示方式: - 可打印的 ASCII 范围内的字节(从空格到 ~),使用 ASCII 字符本身:比如这里的’caf’字符
- 制表符、换行符、回车符和 \ 对应的字节,使用转义序列 \t、\n、\r 和 \
- 其他字节的值,使用十六进制转义序列(例如,\x00 是空字节)
cafe = bytes('café',encoding='utf-8')
print(cafe)
#各个元素是 range(256) 内的整数
print(cafe[0])
#bytes 对象的切片还是 bytes 对象
print(cafe[:1])
cafe_arr = bytearray(cafe)
print(cafe_arr)
#bytearray 对象的切片还是 bytearray 对象
print(cafe_arr[-1:])
mby = bytes.fromhex('31 4B CE A9')
print(mby)
b'caf\xc3\xa9'
99
b'c'
bytearray(b'caf\xc3\xa9')
bytearray(b'\xa9')
b'1K\xce\xa9'
字节的方法
除 了 格 式 化 方 法(format 和 format_map) 和 几 个 处 理 Unicode 数 据 的 方 法( 包 括casefold、isdecimal、isidentifier、isnumeric、isprintable 和 encode) 之 外,str 类
型的其他方法都支持 bytes 和 bytearray 类型.
一个特殊的方法:fromhex
解析十六进制数字对构建二进制序列.
构建 bytes 或 bytearray 实例还可以调用各自的构造方法
- 一个 str 对象和一个 encoding 关键字参数
- 一个可迭代对象,提供 0~255 之间的数值
- 一个整数,使用空字节创建对应长度的二进制序列
- 一个实现了缓冲协议的对象,使用缓冲类对象构建二进制序列是一种低层操作,可能涉及类型转换
# 创建 bytes 或 bytearray 实例还可以调用各自的构造方法
import array
# 一个 str 对象和一个 encoding 关键字参数
b1 = bytes('瓦力人工智能',encoding='utf-8')
print(b1)
# 一个可迭代对象,提供 0~255 之间的数值
mylist = [i for i in range(1,254,50)]
print(mylist)
b2 = bytes(mylist)
print(b2)
# 一个整数,使用空字节创建对应长度的二进制序列
b3 = bytes(10)
print(b3)
# 一个实现了缓冲协议的对象
numbers = array.array('h',[-2,-1,0,1,2])
b4 = bytes(numbers)
print(b4)
b'\xe7\x93\xa6\xe5\x8a\x9b\xe4\xba\xba\xe5\xb7\xa5\xe6\x99\xba\xe8\x83\xbd'
[1, 51, 101, 151, 201, 251]
b'\x013e\x97\xc9\xfb'
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
b'\xfe\xff\xff\xff\x00\x00\x01\x00\x02\x00'
结构体和内存视图中字节的使用
struct 模块提供了一些函数,把打包的字节序列转换成不同类型字段组成的元组,也可以把元组转换成打包的字节序列
memoryview 类不是用于创建或存储字节序列的,而是共享内存,让你访问其他二进制序列、打包的数组和缓冲中的数据切片,而无需复制字节序列.
#使用 memoryview 和 struct 查看一个 GIF 图像的首部
import struct
# 结构体的格式:< 是小字节序,3s3s 是两个 3 字节序列,HH 是两个 16 位二进制整数
fmt = '<3s3sHH'
with open('imgs/01.gif','rb') as fp:
#使用内存中的文件内容创建一个 memoryview 对象…
img = memoryview(fp.read())
#然后使用它的切片再创建一个 memoryview 对象;这里不会复制字节序列
header = img[:10]
# 转换成字节序列
bh = bytes(header)
print(bh)
#拆包 memoryview 对象,得到一个元组,包含类型、版本、宽度和高度
print(struct.unpack(fmt,header))
del header
del img
b'GIF89a\xe8\x03q\x01'
(b'GIF', b'89a', 1000, 369)
分享关于人工智能,机器学习,深度学习以及计算机视觉的好文章,同时自己对于这个领域学习心得笔记。想要一起深入学习人工智能的小伙伴一起结伴学习吧!扫码上车!