Python读取TXT乱码主因是编码未显式指定,应据文件实际编码用encoding='utf-8'或'gbk'等;不确定时可用chardet探测;utf-8-sig可自动处理BOM;read()适合小文件,readline()/readlines()按需选择。

open() 读取 TXT 文件时乱码,90% 是编码没设对
Python 默认用系统 locale 编码打开文件,Windows 上通常是 cp1252 或 gbk,而多数现代 TXT 是 utf-8。不显式指定 encoding,open() 就可能解错字节,直接报 UnicodeDecodeError 或显示“”“锟斤拷”。
- 记事本另存为时选“UTF-8”(注意不是“UTF-8-BOM”),代码里就该用
encoding='utf-8' - 旧 Excel 导出或 Windows 自带编辑器生成的文件,大概率是
gbk,得写encoding='gbk' - 不确定编码时,先用
chardet库探测:chardet.detect(open('file.txt', 'rb').read()),但别在生产逻辑里实时调用——慢且不准 -
utf-8-sig可自动跳过 BOM,适合读含 BOM 的 UTF-8 文件,比硬写utf-8更鲁棒
read()、readline()、readlines() 用哪个?看内存和行处理需求
三者都依赖 open() 返回的文件对象,但行为差异直接影响性能和适用场景。
-
read()一次性加载全部内容为字符串,适合小文件( -
readline()每次读一行,返回含换行符的字符串,适合逐行解析、遇到特定标记就中断的逻辑(如读配置头) -
readlines()返回所有行组成的列表,每行末尾带\n,看似方便切片,但会把整个文件塞进内存——大文件易 OOM - 真正处理大文本,推荐用
for line in f:迭代文件对象,它底层调用readline(),内存友好且语法干净
r、r+、w、a 这些模式到底改什么?别只背字母
模式决定文件指针位置、是否清空内容、能否读写——和你后续调用 read() 或 write() 是否成功强相关。
-
'r':只读,文件必须存在,指针在开头;'w':只写,文件存在则清空,不存在则新建,指针在开头 -
'a':追加写,指针强制移到末尾,write()永远加在最后,但read()会失败(除非显式加+) -
'r+':可读可写,文件必须存在,指针在开头;写操作从开头覆盖,不会自动换行或保留原内容 -
'w+':可读可写,但一打开就清空文件,慎用;'a+':可读可写,写总在末尾,读可以从任意位置开始(需seek())
with open() 不只是“习惯”,是防止文件句柄泄漏的关键
不用 with,靠 f.close() 手动关文件,一旦中间抛异常(比如解码失败、磁盘满),close() 就不会执行,文件句柄卡住,多次运行后可能触发 OSError: [Errno 24] Too many open files。
立即学习“Python免费学习笔记(深入)”;
-
with open('x.txt', encoding='utf-8') as f:确保无论是否异常,退出块时自动调用f.close() - 别写
f = open(...); ...; f.close(),也别以为del f能代替关闭——CPython 可能延迟回收,PyPy 或其他实现更不可靠 - 如果真要手动管理(极少见),至少用
try/finally包住close()










