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。这个参数不只影响读,也影响写入行为。
立即学习“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()构造字节串时,别误以为它能直接当字符串打印——它不是文本










