一、核心概念:编码、码点与字节流的三角关系
这是文本处理的基础,所有操作都围绕这三个概念展开。
1.1 Unicode 码点:字符的'唯一身份证'
Unicode 是一套字符集,核心作用是给世界上所有字符(英文、中文、Emoji 等)分配唯一的数字编号,这个编号就是码点(Code Point),格式为 U+XXXX(如 a 对应 U+0061,中 对应 U+4E2D)。
核心特征
- 码点是逻辑上的固定单位:一个码点对应一个字符,是内存中操作字符的最小单元。
- 数值范围:U+0000 ~ U+10FFFF,不同码点的物理存储长度可变(16 位或 32 位),但对开发者透明。
1.2 编码规则:码点与字节的转换桥梁
- Unicode 只定义了'字符→码点'的映射,而**编码(如 UTF-8、GBK、ASCII)**是'码点→二进制字节'的转换规则。字节是计算机存储和传输的最小单位(0~255),编码的核心作用是解决'如何把码点存进字节'的问题。
常见编码规则对比:
| 编码 | 字节长度 | 核心特点 | 适用场景 |
|---|---|---|---|
| ASCII | 固定 1 字节 | 仅支持 0~127 号码点 | 纯英文文本 |
| UTF-8 | 变长 1~4 字节 | 兼容 ASCII,全球通用 | 多语言文本、文件存储 |
| GBK | 变长 1~2 字节 | 中文优化 | 中文 Windows 系统 |
1.3 bytes 类型:Python 中的字节载体
bytes 是 Python 中不可变的字节序列,专门用于表示二进制数据;与之对应的 bytearray 是可变字节数组,支持修改单个字节。
- 本质:由 0~255 的整数组成,与编码规则绑定,是'码点编码后的产物'。
- 区别:bytes 是'数据语义',不能调用字符方法(如 upper());字符串是'字符语义',底层是码点集合。
二、内存与存储:文本的'两种形态'
Python 处理文本时,始终在'内存中的码点形态'和'存储的字节形态'之间切换,这是理解文件操作的关键。
2.1 内存中:以 Unicode 码点为核心存储
Python 字符串(str)在内存中逻辑上是 Unicode 码点的集合,物理上会做高效存储优化,但对开发者屏蔽细节:
- 索引效率:Python 会将变长存储的码点封装为可直接索引的结构(如等长数组、偏移量表),因此 s[n] 可以直接定位第 n 个字符,无需计算字节偏移。
- 示例:s = 'a 中😊'的 len(s) 为 3,对应 3 个码点,s[2] 可直接获取😊,与底层字节长度无关。
2.2 存储中:以编码后的字节流为形态
- 无论硬盘、网络传输,文本最终都会以编码后的字节流存储,原因是计算机硬件仅识别二进制(0/1)。
- 核心规则:存储时必须通过'编码'将码点转为字节,读取时必须通过'解码'将字节转回码点,且编码与解码规则必须一致,否则会出现乱码。
三、Python 文件操作:编码与解码的实战体现
open() 函数的模式选择,本质是决定'是否参与编码 / 解码',核心区分文本模式与二进制模式。
3.1 二进制模式(rb/wb/ab):不参与编码转换
- 核心含义:r= 只读,b= 二进制,组合后直接操作原始字节流,不做任何编码 / 解码,也不处理换行符。
- 关键特征:无需指定 encoding 参数,读取返回 bytes 类型,写入需传入 bytes 类型。
适用场景:非文本文件(图片、视频、压缩包)、手动控制编码的文本读取。 示例:读取文本文件的原始字节并手动解码

