应使用 io.stringio 处理字符串流、io.bytesio 处理字节流;逐行迭代读取比 readlines() 更省内存;csv 解析需正确配置 delimiter、quotechar 和 quoting;python 3 应直接用 open(..., encoding=...) 而非 codecs.open。

用 io.StringIO 替换字符串做流操作,但别忘了编码边界
字符串不是字节流,io.StringIO 只接受 str,不能塞 bytes;一塞就报 TypeError: initial_value must be str or None。常见于从文件读取后想“假装是流”再处理,结果误把 open(..., 'rb') 的返回值传进去。
- 如果原始数据是字节(比如 HTTP 响应体、二进制文件内容),该用
io.BytesIO,不是StringIO - 如果原始是字符串但含非 ASCII 字符(如中文、emoji),
StringIO没问题,但它不涉及编码/解码——它只管 Unicode 层,编码是写入文件或网络时才发生的 - 别在
StringIO上调用.encode()或期待它有encoding参数——它没有
示例:正确复用字符串为流
import io text = "你好,world\n123" stream = io.StringIO(text) stream.readline() # → "你好,world\n"
逐行读大文本时,for line in f 比 f.readlines() 真的省内存
f.readlines() 会一次性把全部行载入内存,哪怕文件只有 100MB,也可能生成数百万个 str 对象,GC 压力陡增。而 for line in f 是迭代器式读取,底层用缓冲区按需拉取,内存占用基本恒定。
- 注意:
line结尾带换行符\n(或\r\n),需要line.rstrip('\n\r')才能干净取内容 - 如果要跳过空行或注释行,别写
if line.strip(): ...——strip()会新建字符串,高频场景下可改用line[:1] not in ('\n', '\r', '#')这类轻量判断 - Windows 下用
open(..., newline='')能统一换行符行为,避免\r\n被当两行
csv.reader 和 csv.DictReader 的 delimiter 与 quotechar 容易配错
默认逗号分隔、双引号包裹字段,但真实数据常是制表符、竖线,或用单引号、无引号。配错会导致字段劈开错位、头部解析失败,甚至静默吞掉数据。
华友协同办公管理系统(华友OA),基于微软最新的.net 2.0平台和SQL Server数据库,集成强大的Ajax技术,采用多层分布式架构,实现统一办公平台,功能强大、价格便宜,是适用于企事业单位的通用型网络协同办公系统。 系统秉承协同办公的思想,集成即时通讯、日记管理、通知管理、邮件管理、新闻、考勤管理、短信管理、个人文件柜、日程安排、工作计划、工作日清、通讯录、公文流转、论坛、在线调查、
立即学习“Python免费学习笔记(深入)”;
- 用
delimiter='\t'处理 TSV 时,别漏掉quoting=csv.QUOTE_MINIMAL(否则含制表符的字段会崩) - 字段含双引号又不用引号包裹?得设
quotechar=None并配合quoting=csv.QUOTE_NONE,否则报Error: iterator should return strings, not bytes类似错误 -
DictReader读首行当 key,若首行本身有脏字符(空格、BOM、隐藏控制符),key 名会异常,建议先next(f).strip('\ufeff').split(...)预处理头
示例:安全读带单引号、竖线分隔的 CSV
import csv
with open('data.txt') as f:
reader = csv.reader(f, delimiter='|', quotechar="'", quoting=csv.QUOTE_ALL)
for row in reader:
print(row)用 codecs.open 还是 open(..., encoding=...)?Python 3.7+ 就别绕路了
codecs.open 是 Python 2 时代遗留方案,Python 3 中 open 已原生支持 encoding 参数,功能一致且更直观。继续用 codecs.open 不仅多写 import,还会掩盖一个关键点:它的 errors 参数名和行为跟内置 open 不完全等价,容易配错策略。
- 统一用
open(path, encoding='utf-8', errors='replace'),errors可选'ignore'、'replace'、'strict' - UTF-8-BOM 文件?加
encoding='utf-8-sig',它会自动剥离 BOM,不用手动切片 - 读写同一文件时,别混用编码:写用
utf-8,读却用gbk,会直接抛UnicodeDecodeError
真正麻烦的是混合编码日志文件——没有银弹,得靠 chardet 或 charset-normalizer 先探,再重开,这个步骤没法省。









