一、文件操作基础:打开、读取、写入、关闭
文件读写,说白了就是程序跟硬盘上的文件打交道。我刚开始学Python时,觉得这玩意儿特简单——不就是open、read、write、close嘛。但后来在项目中栽过跟头,才发现这里面的门道比想象中多得多。
今天咱们就把这四个基础操作掰开揉碎了讲。你想想看,文件操作就像开门关门——打开要小心,用完要关上,中间干正事。嗯,就这么简单,但细节决定成败。
1.1 打开文件:open() 的正确姿势
打开文件用 open() 函数。我个人习惯把文件路径和打开模式写清楚,别偷懒。
# 最基本的打开方式
file = open('data.txt', 'r') # 'r' 表示只读模式
这里有个坑——文件路径。我在项目中遇到过同事把文件路径写死成绝对路径,结果换台机器就崩了。建议用相对路径,或者用 os.path 模块拼接路径。
常用的打开模式,我整理了一张表:
| 模式 | 含义 | 文件存在时 | 文件不存在时 |
|---|---|---|---|
| 'r' | 只读 | 正常打开 | 报错 |
| 'w' | 写入 | 清空后写入 | 创建新文件 |
| 'a' | 追加 | 末尾追加 | 创建新文件 |
| 'r+' | 读写 | 正常打开 | 报错 |
| 'b' | 二进制模式 | 配合其他模式使用,如 'rb' | |
1.2 读取文件:三种方式,各有千秋
文件打开后,怎么读?我常用的有三种方式:
- read() —— 一口气读完整个文件
- readline() —— 一次读一行
- readlines() —— 读完所有行,返回列表
# 方式一:read() 适合小文件
with open('data.txt', 'r', encoding='utf-8') as f:
content = f.read()
print(content)
# 方式二:readline() 适合逐行处理
with open('data.txt', 'r', encoding='utf-8') as f:
line = f.readline()
while line:
print(line.strip()) # strip() 去掉换行符
line = f.readline()
# 方式三:readlines() 适合需要索引的场景
with open('data.txt', 'r', encoding='utf-8') as f:
lines = f.readlines()
for i, line in enumerate(lines):
print(f"第{i+1}行: {line.strip()}")
你想想看,如果文件有1GB,用 read() 会怎样?内存直接爆炸。我建议大文件用 readline() 或迭代器方式,一次只处理一行。
encoding='utf-8'。我踩过这个坑——没指定编码,Windows 下默认用 GBK,结果中文全变成乱码。
1.3 写入文件:写对位置,写对内容
写入文件分两种场景:覆盖写入和追加写入。说白了就是「清空重写」和「接着写」。
# 覆盖写入('w' 模式)
with open('output.txt', 'w', encoding='utf-8') as f:
f.write("第一行内容\n")
f.write("第二行内容\n")
# 追加写入('a' 模式)
with open('output.txt', 'a', encoding='utf-8') as f:
f.write("这是追加的内容\n")
这里有个细节——write() 不会自动加换行符。你得手动加 \n。我曾经写日志时忘了加,结果所有内容挤在一行,排查了半天才发现。
1.4 关闭文件:别让资源泄漏
文件用完要关,这是铁律。为什么?因为操作系统对打开的文件数量有限制。我见过一个同事写循环打开文件但不关闭,结果程序跑着跑着就报「Too many open files」错误。
最优雅的方式是用 with 语句,它会自动关闭文件:
# 推荐方式:with 语句自动关闭
with open('data.txt', 'r', encoding='utf-8') as f:
content = f.read()
# 出了 with 块,文件自动关闭
# 不推荐方式:手动 close()
f = open('data.txt', 'r', encoding='utf-8')
content = f.read()
f.close() # 容易忘记
我个人只用 with 语句。你想想看,手动 close() 万一中间报错,文件就关不掉了。而 with 语句就算抛出异常,也会帮你关文件。
f.close(),结果文件一直被占用,其他程序无法读写。从那以后,我所有文件操作都用 with 语句,再也没出过问题。
知识体系总览
下面这张图把文件操作的核心流程串起来了。你一看就明白:
这张图把文件操作的四个步骤串起来了。你记住:打开 → 读/写 → 关闭,这个顺序不能乱。尤其是关闭这一步,很多人容易忘。
- 打开文件用
open(),记得指定模式和编码 - 读取文件根据大小选方法,小文件用
read(),大文件用迭代 - 写入文件注意 'w' 会覆盖,'a' 会追加
- 关闭文件用
with语句,省心又安全
好了,文件操作的基础就这些。你把这些练熟了,后面讲调试技巧时才能跟得上。记住,代码写得再漂亮,文件操作出问题,程序照样跑不起来。