文件操作基础:打开、读取、写入、关闭与模式详解
文件读写,说白了就是程序跟硬盘打交道的基本功。我刚开始写Python时,总觉得这玩意儿太简单,不就是open、read、write、close嘛。直到有一次线上服务因为文件句柄泄漏挂了,我才老老实实把这块重新啃了一遍。嗯,今天咱们就把它彻底讲透。
打开文件:一切的起点
Python里打开文件用open()函数。它的核心参数就两个:文件路径和打开模式。
file = open('data.txt', 'r') # 只读模式打开
你想想看,这行代码背后发生了什么?Python向操作系统发起一个系统调用,请求打开这个文件。操作系统返回一个文件描述符,Python把它包装成文件对象。如果文件不存在,'r'模式会直接抛出FileNotFoundError。
os.path或pathlib处理,这样代码移植性更好。
文件模式详解:不只是r和w
文件模式是很多人容易搞混的地方。我列个表,你一看就明白。
| 模式 | 含义 | 文件存在时 | 文件不存在时 |
|---|---|---|---|
'r' |
只读 | 正常打开 | 报错 |
'w' |
只写 | 清空内容 | 创建新文件 |
'a' |
追加 | 末尾追加 | 创建新文件 |
'x' |
独占创建 | 报错 | 创建新文件 |
'r+' |
读写 | 正常打开 | 报错 |
'w+' |
读写 | 清空内容 | 创建新文件 |
'a+' |
读写追加 | 末尾追加 | 创建新文件 |
这里有个坑,我踩过好几次。'w'模式会直接清空文件!我曾经在调试时手滑写了个'w',结果把配置文件给清了。所以我现在有个习惯:写文件前,先确认是不是真的要覆盖。
'r',写用'w',追加用'a',不确定就用'x'保平安。
读取文件:三种姿势
读取文件有三种常用方法,我按使用频率排个序。
read():一次性读取全部内容。适合小文件。readline():每次读一行。适合逐行处理。readlines():读取所有行,返回列表。适合需要随机访问行的情况。
# 方式一:全部读取
content = file.read()
# 方式二:逐行读取
line = file.readline()
while line:
print(line.strip())
line = file.readline()
# 方式三:读取所有行
lines = file.readlines()
for line in lines:
print(line.strip())
我个人最常用的是逐行读取。为什么?因为处理大文件时,一次性读入内存会炸。我记得有一次处理一个2GB的日志文件,用read()直接内存溢出了。从那以后,只要文件超过100MB,我就老老实实逐行读。
for line in file这种迭代方式,Python会自动帮你逐行读取,既简洁又高效。
写入文件:小心覆盖
写入文件同样简单,但要注意模式的选择。
# 写入字符串
file.write('Hello, World!\n')
# 写入多行
lines = ['第一行\n', '第二行\n', '第三行\n']
file.writelines(lines)
注意write()不会自动换行,你得自己加\n。writelines()也不会加换行,它只是把列表里的字符串挨个写进去。这个细节我刚开始也忽略了,结果所有内容都挤在一行。
with语句。
关闭文件:别让句柄泄漏
关闭文件用close()方法。但更推荐的做法是用with语句,它会自动帮你关闭。
# 传统方式
file = open('data.txt', 'r')
content = file.read()
file.close() # 容易忘
# 推荐方式
with open('data.txt', 'r') as file:
content = file.read()
# 离开with块,文件自动关闭
为什么推荐with?因为即使代码中间抛出异常,with也能保证文件被正确关闭。我见过太多因为忘记close()导致文件句柄泄漏的案例了。尤其是长时间运行的服务,句柄泄漏是慢性死亡。
知识体系总览
下面这张图把文件操作的核心流程串起来了,你可以对照着理解。
这张图把整个流程串起来了。从open()开始,选择模式,然后根据需求读或写,最后一定要close()。用with语句的话,最后一步就交给Python自动处理了。
实战建议
说了这么多,我总结几条实战经验。
- 用
with代替手动close():这是Python社区的共识,省心又安全。 - 大文件别用
read():逐行读取是王道,内存友好。 - 写文件前确认模式:
'w'会清空,'a'会追加,别搞混。 - 处理异常:文件可能不存在,权限可能不够,用
try/except兜底。
文件操作看似简单,但细节决定成败。你想想看,一个'w'和'a'的区别,可能就让你丢失几小时的工作成果。所以,多花几分钟理解这些基础,绝对值得。
可可精品资料库