导读:本期聚焦于小伙伴创作的《Python怎么读取TXT文件?open函数读写模式与编码设置详解》,敬请观看详情。直接打开一个中文TXT文件却报出UnicodeDecodeError,往往是编码参数没配对。Python内置的open函数通过mode控制读r、写w、追加a等模式,用encoding指定字符集。若省略encoding,程序会采用系统默认编码,Windows下常是gbk,而文件实际为utf-8时就会解析失败。理解t与b文本二进制区别、用with语句自动关句柄、在写模式里选w覆写或a续写,能避免内容丢失。本文理清这些参数组合,并给出带转义字符的安全代码示例,帮你稳定处理各类文本读写场景。

在Python中处理本地文本数据时,最基础也最容易出错的环节就是使用open函数操作TXT文件。很多异常并不是逻辑写错,而是读写模式和编码参数没有根据文件实际情况配置。只有把mode和encoding两个核心参数弄明白,才能写出健壮的文件处理代码。

Python怎么读取TXT文件?open函数读写模式与编码设置详解

一、open函数的基本结构与参数

open函数是Python内置的底层文件接口,返回一个文件对象,后续所有读写都基于这个对象进行。其最常用的签名是open(file, mode='r', encoding=None),其中file是路径字符串,mode决定打开方式,encoding设定字符解码方案。

如果不显式传入encoding,CPython在文本模式下会调用locale.getpreferredencoding()获取系统偏好编码。这导致同一份代码在Linux服务器(多为utf-8)和Windows开发机(多为gbk)上行为不一致。因此工程实践中建议永远明确写出encoding。

# 最基础的读文本写法
f = open('demo.txt', mode='r', encoding='utf-8')
content = f.read()
f.close()

二、读写模式mode详解

mode由主模式字母和可选修饰字母组成。主模式包括r(只读,文件不存在则报错)、w(只写,存在则清空)、a(追加,存在则在末尾写)、x(新建,存在则失败)。修饰字母t表示文本模式(默认),b表示二进制模式。

常见组合有rt(默认文本读)、wt(文本写覆盖)、at(文本追加)、rb(二进制读,如图片)。注意w和a在文件不存在时都会新建,但w每次打开都会截断原内容,a则保留原内容。若既要读又要写,可用r+(文件必须存在)、w+(清空后读写)、a+(追加且可读)。

模式文件不存在存在时内容指针位置
r抛异常保留开头
w新建清空开头
a新建保留末尾
r+抛异常保留开头

文本模式与二进制模式差异

在t模式下,Python会自动按encoding做字节到字符串的转换,并且统一换行符为n。在b模式下,读写对象都是bytes,不做任何编码转换,适合非文本文件或需要精确字节控制的场景。

例如用rb读取TXT再去手动decode,可以捕获部分解码错误行;而rt模式下一旦encoding不对,read瞬间就会抛UnicodeDecodeError。选择哪种取决于你是否需要容错处理。

# 二进制读再解码,可逐段处理错误
with open('demo.txt', 'rb') as bf:
    raw = bf.read()
text = raw.decode('utf-8', errors='replace')

三、编码设置的最佳实践

encoding参数直接决定字节如何变成字符。中文环境常见编码有utf-8(无BOM通用)、gbk(Windows记事本默认)、utf-8-sig(带BOM的utf-8)。如果TXT由Windows记事本保存,未改编码时可能是gbk;由编辑器保存多为utf-8。

一个稳妥的写法是:读取时先试utf-8,失败再退gbk;或者统一用utf-8-sig写文件,这样在Windows上用记事本打开也不会乱码。Python的open支持传入任意标准编解码器名称。

def read_text_safe(path):
    for enc in ('utf-8', 'gbk'):
        try:
            with open(path, 'r', encoding=enc) as f:
                return f.read()
        except UnicodeDecodeError:
            continue
    raise ValueError('无法用常见编码读取文件')

print(read_text_safe('demo.txt'))

with语句与资源释放

手动调用close容易因异常而遗漏,造成文件句柄泄露。with语句会在块结束时自动调用文件对象的__exit__,无论是否报错都会关闭,是官方推荐写法。

在with内可以进行多步读写,例如先读后写新文件,逻辑清晰且安全。下面的例子展示用a模式追加日志,并指定utf-8避免乱码。

with open('log.txt', 'a', encoding='utf-8') as log:
    log.write('程序启动n')
    log.write('处理完成n')

四、常见错误与避坑

第一个坑是路径中含有反斜杠未转义,如open('C:newtest.txt')中n被当换行。应写原始字符串r'C:newtest.txt'或用正斜杠。第二个坑是用w模式打开重要文件导致原内容丢失,应确认是否需要a。

第三个坑是忽略encoding让程序跨平台出错。建议在项目入口统一封装文件读写函数,固定encoding='utf-8',并在文档注明文件格式要求,减少协作中的乱码争议。

总结:读TXT用open时,明确mode是r/w/a及是否带+,并显式设置encoding。优先用with管理生命周期,遇到解码异常再按字节或备选编码处理,就能覆盖绝大多数文本场景。

Pythonopen函数文件编码修改时间:2026-08-06 05:48:32

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。