python 字符问题和字节问题

本文介绍了Python中处理二进制序列的方法,包括bytes和bytearray类型的使用、构造方法及与字符串的区别。还探讨了如何利用struct模块和memoryview类进行更高级的数据处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1,字符问题
在python3中,字符的定义是: 字符的定义是Unicode 字符,也就是说: 从Python 3 的 str 对象中获取 的元素是Unicode 字符,这相当于从Python 2 的 unicode 对象中获取的元素,而不是从 Python 2 的 str 对象中获取的原始字节序列。

下面这个是python2和python3的区别比较:(把码位转换成字节序列的过程是编码;把字节序列转换成码位的过程是解码。)
在这里插入图片描述
在这里插入图片描述
二、python字节概要
新的二进制序列类型在很多方面与 Python 2 的 str 类型不同。首先要知道,Python 内置 了两种基本的二进制序列类型:Python 3 引入的不可变 bytes 类型和 Python 2.6 添加的可 变 bytearray 类型。( Python 2.6 也引入了 bytes 类型,但那只不过是 str 类型的别名,与 Python 3 的 bytes 类型不同。)

bytes 或 bytearray 对象的各个元素是介于0~255(含)之间的整数,而不像Python 2 的 str 对象那样是单个的字符。然而,二进制序列的切片始终是同一类型的二进制序列,包括长度为 1 的切片。

对于python2.6及以上(python2)。
在这里插入图片描述
对于python3
在这里插入图片描述
三、对比
my_bytes[0] 获取的是一个整数,而my_bytes[:1] 返回的是一个长度为1 的 bytes 对象——这一点应该不会让人意外。s[0] == s[:1] 只对 str 这个序列类 型成立。不过,str 类型的这个行为十分罕见。对其他各个序列类型来说,s[i] 返回一个元素,而 s[i:i+1] 返回一个相同类型的序列,里面是 s[i] 元素。

四、其他
虽然二进制序列其实是整数序列,但是它们的字面量表示法表明其中有 ASCII 文本。因 此,各个字节的值可能会使用下列三种不同的方式显示。
1、可打印的 ASCII 范围内的字节(从空格到 ~),使用 ASCII 字符本身。
2、制表符、换行符、回车符和 \ 对应的字节,使用转义序列 \t、\n、\r 和 \。
3、其他字节的值,使用十六进制转义序列(例如,\x00 是空字节)。

五、二进制序列和字符串对比
除 了 格 式 化 方 法(format 和 format_map)和几个处理Unicode 数 据 的 方 法( 包 括 casefold、isdecimal、isidentifier、isnumeric、isprintable 和 encode) 之 外,str 类 型的其他方法都支持 bytes 和 bytearray 类型。这意味着,我们可以使用熟悉的字符串方 法处理二进制序列,如 endswith、replace、strip、translate、upper 等,只有少数几个 其他方法的参数是 bytes 对象,而不是 str 对象。此外,如果正则表达式编译自二进制 序列而不是字符串,re 模块中的正则表达式函数也能处理二进制序列。Python 3.0~3.4 不 能使用 % 运算符处理二进制序列,但是根据“PEP 461—Adding % formatting to bytes and bytearray”( https://www.python.org/dev/peps/pep-0461/), Python 3.5 应该会支持。

二进制序列有个类方法是 str 没有的,名为 fromhex,它的作用是解析十六进制数字对 (数字对之间的空格是可选的),构建二进制序列:
在这里插入图片描述

六、bytes 和 bytearray 构建
1、一个 str 对象和一个 encoding 关键字参数。
2、一个可迭代对象,提供 0~255 之间的数值。
3、一个整数,使用空字节创建对应长度的二进制序列。[Python 3.5 会把这个构造方法标 记为“过时的”,Python 3.6 会将其删除。参见“PEP 467—Minor API improvements for binary sequences”( https://www.python.org/dev/peps/pep-0467/)。 ]
4、一个实现了缓冲协议的对象(如 bytes、bytearray、memoryview、array.array);此时, 把源对象中的字节序列复制到新建的二进制序列中。

使用缓冲类对象构建二进制序列是一种低层操作,可能涉及类型转换。
在这里插入图片描述
使用缓冲类对象创建 bytes 或 bytearray 对象时,始终复制源对象中的字节序列。与之相反, memoryview 对象允许在二进制数据结构之间共享内存。如果想从二进制序列中提取结构化信 息,struct 模块是重要的工具。下面会使用这个模块处理 bytes 和 memoryview 对象。

七、结构体和内存视图
struct 模块提供了一些函数,把打包的字节序列转换成不同类型字段组成的元组,还有 一些函数用于执行反向转换,把元组转换成打包的字节序列。struct 模块能处理 bytes、 bytearray 和 memoryview 对象。

memoryview 类不是用于创建或存储字节序列的,而是共享内存,让你访 问其他二进制序列、打包的数组和缓冲中的数据切片,而无需复制字节序列,例如 Python Imaging Library(PIL)2 就是这样处理图像的。
在这里插入图片描述
1,结构体的格式:< 是小字节序,3s3s 是两个 3 字节序列,HH 是两个 16 位二进制整数。
2,使用内存中的文件内容创建一个 memoryview 对象……
3,然后使用它的切片再创建一个 memoryview 对象;这里不会复制字节序列。
4,转换成字节序列,这只是为了显示;这里复制了 10 字节。
5,拆包 memoryview 对象,得到一个元组,包含类型、版本、宽度和高度。
6,删除引用,释放 memoryview 实例所占的内存。

注意,memoryview 对象的切片是一个新 memoryview 对象,而且不会复制字节序列。[如果使用 mmap 模块把图像打开为内存映射文件, 那么会复制少量字节。本书不会讨论 mmap,如果你经常读取和修改二进制文件,可以阅读 “mmap—Memory-mapped file support”( https://docs.python.org/3/library/mmap.html)来进一 步学习。]

如果要处理二进制数据,可以阅读它们的文 档:“ Built-in Types » Memory Views”( https://docs.python.org/3/library/stdtypes.html#memory-views)和“struct—Interpret bytes as packed binary data”( https://docs.python.org/3/library/struct.html)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值