(三)文本、字节、编码与换行
1. 字符串先编码成字节再保存
# str 保存文本;encode 按 UTF-8 编码,decode 从同一种编码还原文本。
text = "书A"
data = text.encode("utf-8")
print(len(text), len(data))
print(list(data))
print(data.decode("utf-8"))输出 2 4、[228, 185, 166, 65]、书A。两个字符不等于两个字节。文本文件的读取过程会先取得字节,再根据指定编码组成字符串;二进制读取直接交回 bytes,例如图片、压缩包和下载文件的数据。
# 这份字节按 UTF-8 保存,用 ASCII 解码时会在非 ASCII 字节处失败。
data = "书".encode("utf-8")
try:
data.decode("ascii")
except UnicodeDecodeError:
print("编码选择错误")输出“编码选择错误”。乱码或解码失败时,先查实际来源使用的编码,再按它读取。errors="ignore" 会丢掉不能解码的内容,得到的文本已经缺字;读取成功和数据保持完整是两件事。
2. 文本位置与换行转换
# tell 保存文本流可恢复的位置;将它原样交回 seek,而不是按字符数猜偏移。
from pathlib import Path
path = Path("text-position.txt")
path.write_text("书A", encoding="utf-8")
with path.open(encoding="utf-8") as stream:
print(stream.read(1))
position = stream.tell()
print(stream.read(1))
stream.seek(position)
print(stream.read(1))输出“书”“A”“A”。文本流的位置还涉及编码器和换行状态,tell() 结果作为恢复用的位置值阅读;按字节定位则使用前面的二进制模式。
文本读取通常把 \r\n、\r 这样的行尾形式统一成 \n;写入时,默认换行处理还会结合系统规则。CSV 会自行管理字段中的换行,后面打开 CSV 文件时明确写 newline="",让它接收和处理原始行尾。