Python 3 中 str 和 bytes 是互不兼容的类型,str 表示 Unicode 文本,bytes 表示原始字节;必须用 encode()/decode() 显式转换,且需指定编码(如 "utf-8"),文件读写、网络请求等 I/O 操作需严格匹配类型。

字符串是 Unicode,字节串是 raw bytes
Python 3 中 str 和 bytes 是两种完全不同的类型,不能直接拼接或比较。前者表示人类可读的文本(Unicode 码点序列),后者表示原始的 0/1 字节序列。常见错误如 "hello" + b"world" 会直接报 TypeError: can't concat str to bytes。
关键判断依据:文件路径、网络请求体、加密输入等底层 I/O 操作几乎都要求 bytes;而用户输入、日志打印、JSON 解析结果等基本都是 str。
encode() 和 decode() 是唯一安全转换方式
转换必须显式指定编码(encoding),最常用的是 "utf-8"。没有“默认自动识别”这回事——Python 不会猜你存的是 GBK 还是 UTF-8,猜错就出乱码。
-
"你好".encode("utf-8")→b"\xe4\xbd\xa0\xe5\xa5\xbd" -
b"\xe4\xbd\xa0\xe5\xa5\xbd".decode("utf-8")→"你好" - 用错编码会触发
UnicodeDecodeError或UnicodeEncodeError,比如用"gbk"去解一个 UTF-8 字节串 - 某些场景下可用
errors="ignore"或errors="replace"避免崩溃,但会丢失或替换数据,慎用
读写文件时 encoding 参数决定返回类型
打开文件不用 encoding 参数(即默认二进制模式),read() 返回 bytes;显式指定 encoding(如 open("f.txt", "r", encoding="utf-8")),则返回 str。这个参数不只影响读,也影响写入行为。
Perl学习手札是台湾perl高手写的一篇文章,特打包为chm版,方便大家阅读。 关于本书 1. 关于Perl 1.1 Perl的历史 1.2 Perl的概念 1.3 特色 1.4 使用Perl的环境 1.5 开始使用 Perl 1.6 你的第一个Perl程序 2. 标量变量(Scalar) 2.1 关于标量 2.1.1 数值 2.1.2 字符串 2.1.3 数字与字符串转换 2.2 使用你自己的变量 2.3 赋值 2.3.1 直接设定 2.3.2 还可以这样 2.4 运算 2.5 变量的输出/输入 2.
立即学习“Python免费学习笔记(深入)”;
- 二进制模式:
open("data.bin", "rb")→ 必须用bytes写,read()返回bytes - 文本模式:
open("text.txt", "w", encoding="utf-8")→ 只能用str写,write("abc")合法,write(b"abc")报错 - Windows 上不指定
encoding且用文本模式,可能默认用cp1252,导致中文直接乱码
网络和序列化场景下类型容易被忽略
HTTP 请求体、socket 发送、json.dumps() 输出、pickle 序列化结果……这些操作对输入类型的敏感度极高。例如 requests.post(url, data=b"raw") 发的是字节流,而 data="text" 会被自动编码为 UTF-8 字节再发;但如果你手动 .encode() 了又传给 data=,就可能被二次编码。
-
json.loads()接收str或bytes,但后者必须是 UTF-8 编码,否则报错 -
subprocess.run(..., input=b"xxx")要求bytes,而input="xxx"会尝试用系统默认编码转,不可靠 - 用
bytes.fromhex("aabbcc")或int.to_bytes()构造字节串时,别误以为它能直接当字符串打印——它不是文本









