1. 文件操作基础

文件读写,说白了就是程序跟硬盘打交道的基本功。我刚开始写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'保平安。

读取文件:三种姿势

读取文件有三种常用方法,我按使用频率排个序。

  1. read():一次性读取全部内容。适合小文件。
  2. readline():每次读一行。适合逐行处理。
  3. 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() 打开文件 选择模式:'r' 只读 | 'w' 只写 | 'a' 追加 | 'r+' 读写 注意:'w' 会清空文件,'x' 会防止覆盖 读取操作 read() 全部读取 readline() 逐行读取 readlines() 读取所有行 写入操作 write() 写入字符串 writelines() 写入多行 注意手动加 \n close() 关闭文件

这张图把整个流程串起来了。从open()开始,选择模式,然后根据需求读或写,最后一定要close()。用with语句的话,最后一步就交给Python自动处理了。

实战建议

说了这么多,我总结几条实战经验。

  • 用with代替手动close():这是Python社区的共识,省心又安全。
  • 大文件别用read():逐行读取是王道,内存友好。
  • 写文件前确认模式:'w'会清空,'a'会追加,别搞混。
  • 处理异常:文件可能不存在,权限可能不够,用try/except兜底。
我的习惯: 每次打开文件前,我都会问自己三个问题:文件存在吗?我要读还是写?如果写,是覆盖还是追加?想清楚再动手,基本不会出问题。

文件操作看似简单,但细节决定成败。你想想看,一个'w'和'a'的区别,可能就让你丢失几小时的工作成果。所以,多花几分钟理解这些基础,绝对值得。

可可精品资料库