上一章我们已经知道,文件操作最基础的流程就是三步。
打开文件 操作文件 关闭文件
其中最关键的入口,就是 open()。
很多初学者学文件时,表面上看会写:
f = open('demo.txt', 'r', encoding='utf-8')
但心里其实是模糊的。 为什么这里要写 r为什么还要写 encoding='utf-8'文件名到底写相对路径还是绝对路径 为什么别人代码能跑,我的代码却说找不到文件
这一章,就是专门把这些问题一次讲清。
一、先把 open() 看成一扇门
你可以把 open() 理解成打开一扇门。
门后面是文件。 你要先把门打开,才能进去读内容,或者往里面写内容。
最常见的写法是:
f = open('demo.txt', 'r', encoding='utf-8')
这一行代码里,其实已经包含了三个核心信息:
第一个,打开哪个文件 第二个,用什么方式打开 第三个,用什么编码处理内容
所以你可以先把它读成一句人话:
打开 demo.txt 这个文件 按读取模式打开 并且用 utf-8 编码去解析它
只要你能把这句话读顺,open() 就不再神秘了。
二、open() 最核心的几个参数
先看最常见的结构:
open(文件路径, 打开模式, encoding=编码方式)
最重要的就是这三项。
文件路径 模式 编码
你现在先不用追求记住所有参数,只要先把这三样吃透,日常开发里已经够用了。
三、模式到底是什么
模式,决定了你打开文件以后,到底想干什么。
最常见的模式有四个:
r 读取w 写入a 追加x 独占创建
这四个里,初学阶段最常用的是前三个。
我们一个一个讲。
四、r 模式:读取文件
r 是 read 的意思,也就是读取。
f = open('demo.txt', 'r', encoding='utf-8')content = f.read()print(content)f.close()
这种模式适合什么场景?
你已经有一个文件 你只想看里面的内容 不打算修改它
比如:
读取日志 读取配置 读取一篇文章 读取一份名单
要注意一点,r 模式有个前提:文件必须真实存在。
如果文件不存在,就会直接报错。
比如你写:
f = open('abc.txt', 'r', encoding='utf-8')
但当前目录根本没有这个文件,程序就会报 FileNotFoundError。
这个错很常见,而且一点都不可怕。它只是告诉你,程序找不到你说的那个文件。
五、w 模式:写入文件
w 是 write 的意思,也就是写入。
f = open('note.txt', 'w', encoding='utf-8')f.write('开始学习 open 的用法')f.close()
执行完以后,会发生两件事之一。
如果 note.txt 原本不存在,Python 会帮你创建它。 如果 note.txt 原本已经存在,Python 会先清空原内容,再写入新的内容。
这个特点非常重要。
很多新手第一次用 w,会以为是往原文件后面补内容。其实不是。w 的行为更像是重写一份。
你可以把它理解成:
旧内容不要了 从头开始写新的
所以只要你使用 w,就要有覆盖旧内容的心理准备。
六、a 模式:追加内容
a 是 append 的意思,也就是追加。
f = open('log.txt', 'a', encoding='utf-8')f.write('新增一条记录\n')f.close()
它和 w 最大的区别就是:
w 会覆盖原内容a 会保留原内容,并且把新内容加到最后
这在很多场景里非常实用。
比如:
写运行日志 记录用户操作 持续保存采集结果 每天往同一个文件里补数据
如果文件原本不存在,a 模式也会自动创建。
所以你可以这样记:
想重新写一份,用 w想接着往后写,用 a
七、x 模式:文件必须不存在
x 相对没那么常用,但也值得认识一下。
f = open('new.txt', 'x', encoding='utf-8')f.write('这是新建文件')f.close()
它的特点是:
文件不存在时,创建并写入 文件已经存在时,直接报错
也就是说,x 比较适合那种你不希望误覆盖旧文件的场景。
不过对初学者来说,先把 r、w、a 用熟更重要。
八、三种常用模式,放在一起对比最容易记
你可以用下面这个表意去理解它们。
r只读 文件必须存在
w重写 文件不存在会创建 文件存在会清空
a追加 文件不存在会创建 文件存在就在末尾继续写
真正学会文件模式,不是死记字母,而是知道每种模式背后的行为。
九、为什么很多代码里都写 encoding='utf-8'
这是初学者第二个高频疑问。
直接说结论:处理文本文件时,尽量养成写 encoding='utf-8' 的习惯。
原因很简单。电脑保存文字时,不是按“汉字长什么样”直接存进去的,而是按编码规则转成字节保存。
你可以把编码理解成一种翻译规则。
程序写文件时,要把文字翻译成字节。 程序读文件时,要把字节再翻译回文字。
如果写入和读取使用的规则不一致,就容易乱码,甚至报错。
比如下面这句:
f = open('test.txt', 'w', encoding='utf-8')f.write('你好,Python')f.close()
这里的意思就是: 把这段中文按照 utf-8 规则写进文件。
后面读取时,也最好继续使用 utf-8:
f = open('test.txt', 'r', encoding='utf-8')print(f.read())f.close()
这样最稳妥。
十、utf-8 为什么这么常见
因为 utf-8 兼容性很好,能处理中文,也能处理英文,是现在非常通用的一种编码方式。
你现在不需要钻进编码底层细节里,只要先建立一个实际开发习惯:
读写中文文本文件时,优先写上 encoding='utf-8'。
这能帮你避开大量乱码问题。
十一、路径到底是什么
如果说模式决定你要做什么,编码决定你怎么看文字,那么路径决定的就是:
你到底要操作哪一个文件。
比如:
open('demo.txt', 'r', encoding='utf-8')
这里的 'demo.txt' 就是路径。
它表示当前程序要找一个叫 demo.txt 的文件。
但问题来了。电脑里同名文件可能很多个,Python 怎么知道你说的是哪一个?
答案就是:靠路径定位。
路径本质上就是文件地址。
十二、相对路径和绝对路径
这是最容易混淆的地方之一。
先说相对路径。
open('demo.txt', 'r', encoding='utf-8')
这种写法就是相对路径。 它的意思不是这个文件在电脑上的完整位置,而是相对于当前程序运行的位置去找。
你也可以写成:
open('data/demo.txt', 'r', encoding='utf-8')
这表示去当前目录下的 data 文件夹里找 demo.txt。
相对路径的优点是简洁,项目搬家时也更灵活。 所以写项目时,经常会用相对路径。
再说绝对路径。
比如 Windows 里可能长这样:
open('D:/python_project/data/demo.txt', 'r', encoding='utf-8')
这就是完整地址,直接告诉 Python 文件在硬盘上的哪个位置。
绝对路径的优点是明确。 缺点是不够灵活,换一台电脑、换一个文件夹,路径可能就失效了。
十三、初学者为什么总是找不到文件
因为很多人以为,文件路径是相对于代码文件所在位置。 其实不一定。
Python 查找相对路径时,更关键的是:当前运行目录在哪里。
这句话初学时会有点绕。你先这样理解:
你双击运行、终端运行、IDE 运行,程序的工作目录可能不一样。 所以同样一句 open('demo.txt'),有时能找到文件,有时找不到。
如果你明明创建了文件,却还是报找不到文件,优先检查这几个问题:
文件名有没有写错 后缀名有没有写错 文件是不是和程序在同一个运行目录 是不是放进了别的文件夹 路径里的斜杠有没有问题
很多时候,不是 Python 有问题,而是路径没写对。
十四、路径里的斜杠为什么也会出问题
尤其是 Windows 用户,经常在这里踩坑。
你可能会这样写:
open('D:\new\test.txt', 'r', encoding='utf-8')
看起来没毛病,但实际上这里可能有问题。因为反斜杠在字符串里有时会被当作转义符处理。
比如 \n 是换行,\t 是制表符。
所以路径里如果恰好碰到这些组合,就可能出错。
更稳妥的写法有三种。
第一种,使用正斜杠:
open('D:/new/test.txt', 'r', encoding='utf-8')
第二种,使用双反斜杠:
open('D:\\new\\test.txt', 'r', encoding='utf-8')
第三种,使用原始字符串:
open(r'D:\new\test.txt', 'r', encoding='utf-8')
初学阶段,你记住一个最省事的方法就行:路径里尽量用正斜杠。
这样最不容易踩坑。
十五、一个例子,把模式、编码、路径一起看懂
假设你要在当前目录下创建一个 study.txt 文件,并写入两行内容。
f = open('study.txt', 'w', encoding='utf-8')f.write('第一天:学会 open\n')f.write('第二天:学会路径和编码\n')f.close()
这里三部分分别表示什么?
study.txt表示文件路径,这里是相对路径
w表示写入模式,会新建文件或覆盖原文件
encoding='utf-8'表示按 utf-8 编码写入文本
再把它读出来:
f = open('study.txt', 'r', encoding='utf-8')content = f.read()print(content)f.close()
这时:
路径还是 study.txt模式变成了 r编码仍然用 utf-8
如果这套思路你能说清楚,说明你已经真正理解 open() 了。
十六、初学者最常见的几个误区
第一个误区,只记语法,不理解行为。 比如知道 w 是写入,但不知道它会覆盖旧内容。
第二个误区,觉得编码是可有可无。 结果一处理中文文件,就开始乱码。
第三个误区,分不清相对路径和绝对路径。 文件明明存在,却总是打不开。
第四个误区,把路径字符串写错。 尤其是 Windows 路径里,反斜杠最容易埋坑。
这些都不是大问题。文件操作本来就是一个很容易在细节上翻车的知识点。关键不是一次全记住,而是每次遇到问题都能对照排查。
十七、一个小实验,感受 w 和 a 的区别
先运行这段代码:
f = open('demo.txt', 'w', encoding='utf-8')f.write('第一行内容\n')f.close()
再运行:
f = open('demo.txt', 'w', encoding='utf-8')f.write('第二次写入\n')f.close()
你会发现,文件里只剩:
第二次写入
因为第二次 w 把第一次内容覆盖掉了。
接着改成下面这样:
f = open('demo.txt', 'a', encoding='utf-8')f.write('第三次追加\n')f.close()
这时文件内容就会变成:
第二次写入第三次追加
这个实验非常值得你自己跑一遍。 很多概念只看文字不深,自己运行一下立刻就明白了。
十八、本章你最该掌握的,不是背参数,而是形成判断力
以后你只要看到一行代码:
open('xxx', '某种模式', encoding='utf-8')
你脑子里要马上能跳出三个判断。
它在操作哪个文件 它是要读、重写还是追加 它是按什么编码处理文本
一旦这三个点看清,文件操作的大半问题你都能自己判断。
十九、本章小练习
练习 1 创建一个 note.txt 文件,写入一句话: 今天我学会了 open 的模式和编码
练习 2 再用追加模式补一行: 接下来我要继续学 with 语句
练习 3 把整个文件读出来并打印
参考代码:
f = open('note.txt', 'w', encoding='utf-8')f.write('今天我学会了 open 的模式和编码\n')f.close()f = open('note.txt', 'a', encoding='utf-8')f.write('接下来我要继续学 with 语句\n')f.close()f = open('note.txt', 'r', encoding='utf-8')print(f.read())f.close()
你把这段代码自己完整敲一遍,本章内容就算真正落地了。
二十、本章总结
这一章你要拿下三件事。
第一,理解 open() 的本质 它就是打开文件的入口
第二,掌握三种高频模式r 用来读w 用来重写a 用来追加
第三,建立两个好习惯 处理文本优先写 encoding='utf-8'路径问题优先检查文件位置和写法
只要这三点过关,后面学 with、学文本读写、学 CSV、学异常处理,都会顺很多。
下一章我们继续讲一个非常重要的写法:with 语句为什么这么重要:资源管理的优雅写法。