
《流畅的Python》文本与字节一文搞懂str与bytes的实战避坑指南【免费下载链接】fluent-python《流畅的Python》2015年8月项目地址: https://gitcode.com/gh_mirrors/fl/fluent-python在开源项目《流畅的Python》中第4章「文本与字节」从底层讲透了一个核心问题str 是 Unicode 文本bytes 是原始二进制序列。如果你曾被bcaf\xc3\xa9这样的乱码困扰或在文件读写中撞上 UnicodeDecodeError这篇文章会带你一次性理清 Python 文本与字节的转换原理和常见坑点。1. 先搞懂概念str 与 bytes 的本质区别书中开篇即引用了一句经典的话人类使用文本交流而计算机则使用字节通信。在 Python 3 中这两者被彻底区分开来类型本质示例strUnicode 字符序列码点范围 0 ~ 1,114,111cafébytes不可变的 0~255 整数序列bcaf\xc3\xa9bytearraybytes 的可变版本bytearray(b...\xa9) 一个实用的记忆口诀decode解码bytes → str把机器码翻译成人类可读文本encode编码str → bytes把人类文本压缩后用于存储和传输⚠️最常见的坑把 bytes 当文本直接处理。bcaf\xc3\xa9看起来像 4 个字符其实是 5 个字节整数混用就会报错。2. bytes 是整数序列取值和切片的行为与 str 不同这是 str 与 bytes 最微妙的一处差异cafe bytes(café, encodingutf_8) cafe[0] # 99 —— 元素是整数不是字符串 cafe[:1] # bc —— 切片仍返回 bytesbytes / bytearray 的每个元素是 0~255 的整数这与 Python 2 的 str 完全不同切片永远返回同类型即使只切 1 个字节结果也是bytes显示规则很贴心可打印 ASCII 原样显示\t\n等用转义序列其余字节用十六进制如\xc3str 和 bytes 同为序列类型都遵循通用的可迭代协议可迭代对象Iterable通过__iter__构建迭代器Iterator再靠__next__逐个取值——遍历字符串得到字符遍历字节串得到整数。3. 编码与解码str 与 bytes 之间的桥梁同一段文本不同编码会产生完全不同的字节。以 El Niño 为例编码编码结果latin_1bEl Ni\xf1outf_8bEl Ni\xc3\xb1outf_16b\xff\xfeE\x00l\x00 \x00N\x00i\x00\xf1\x00o\x00 两条必须记住的常识UTF-8 是网页编码的绝对主流约 80% 的网站在使用且完全向后兼容 ASCIIPython 3 内置了100 多种编解码器str.encode(utf-8)与bytes.decode(utf-8)是一对可逆操作s café b s.encode(utf-8) # 编码str → bytes注意 é 占了 2 个字节 b.decode(utf-8) # 解码bytes → str还原为 café书中特别指出ASCII 以及 GB2312 等老编码无法表示全部Unicode 字符包括 emoji只有 UTF 系列编码能做到全覆盖。4. 两大坑点UnicodeEncodeError 与 UnicodeDecodeError 的处理坑点一编码报错str → bytes当目标编码里没有某个字符时就会抛错例如 IBM 老字符集 cp437 编不了 ãcity São Paulo city.encode(cp437) # ❌ UnicodeEncodeError city.encode(cp437, errorsignore) # bSo Paulo静默丢弃数据丢失 city.encode(cp437, errorsreplace) # bS?o Paulo替换成 ?用户能察觉异常⚠️errorsignore会悄悄丢掉字符——书中明确提醒这通常是一个非常糟糕的主意。坑点二解码报错bytes → str更隐蔽的是cp1252、iso8859_1 这类老式 8 位编码能成功解码任意字节流甚至随机噪音都不会报错。也就是说一旦你假设了错误的编码程序会静默地解码出一堆乱码连错误都看不到。排错第一步永远是看异常类型UnicodeEncodeError说明编码方向出错UnicodeDecodeError说明解码方向出错——先理解错误再谈解决。5. Python str 与 bytes 最佳实践清单✅ 网页接口与文件默认按UTF-8处理涉及非 ASCII 文本时先确认对方编码✅ 文本与字节转换一律使用.encode()/.decode()配对显式指定编码✅ 读写二进制文件用rb/wb模式不要与文本模式混用✅ 处理编码错误时优先errorsreplace而非errorsignore避免静默丢数据完整章节内容还涉及 memoryview、struct 解析、Unicode 正规化等进阶主题可查阅项目根目录下的04章文本与字节.md文件。【免费下载链接】fluent-python《流畅的Python》2015年8月项目地址: https://gitcode.com/gh_mirrors/fl/fluent-python创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考