一、文件操作基础:打开、读取、写入、关闭

文件读写,说白了就是程序跟硬盘上的文件打交道。我刚开始学Python时,觉得这玩意儿特简单——不就是open、read、write、close嘛。但后来在项目中栽过跟头,才发现这里面的门道比想象中多得多。

今天咱们就把这四个基础操作掰开揉碎了讲。你想想看,文件操作就像开门关门——打开要小心,用完要关上,中间干正事。嗯,就这么简单,但细节决定成败。

1.1 打开文件:open() 的正确姿势

打开文件用 open() 函数。我个人习惯把文件路径和打开模式写清楚,别偷懒。

# 最基本的打开方式
file = open('data.txt', 'r')  # 'r' 表示只读模式

这里有个坑——文件路径。我在项目中遇到过同事把文件路径写死成绝对路径,结果换台机器就崩了。建议用相对路径,或者用 os.path 模块拼接路径。

⚠️ 注意: 文件不存在时,'r' 模式会直接报错 FileNotFoundError。如果你不确定文件是否存在,可以用 'w'(写入)或 'a'(追加)模式,它们会自动创建文件。

常用的打开模式,我整理了一张表:

模式 含义 文件存在时 文件不存在时
'r' 只读 正常打开 报错
'w' 写入 清空后写入 创建新文件
'a' 追加 末尾追加 创建新文件
'r+' 读写 正常打开 报错
'b' 二进制模式 配合其他模式使用,如 'rb'
💡 我的小技巧: 处理文本文件用 'r' 或 'w',处理图片、视频等二进制文件一定要加 'b'。我曾经用 'r' 模式读图片,结果全是乱码,折腾了半天才发现是模式选错了。

1.2 读取文件:三种方式,各有千秋

文件打开后,怎么读?我常用的有三种方式:

  1. read() —— 一口气读完整个文件
  2. readline() —— 一次读一行
  3. 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。我曾经写日志时忘了加,结果所有内容挤在一行,排查了半天才发现。

⚠️ 注意: 'w' 模式会清空原文件!如果你只是想修改部分内容,别用 'w'。我建议先用 'r' 读出来,修改后再用 'w' 写回去,或者用 'r+' 模式。

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() / readline() / readlines() 写入文件 write() / writelines() 关闭文件 with 语句自动关闭 / close()

这张图把文件操作的四个步骤串起来了。你记住:打开 → 读/写 → 关闭,这个顺序不能乱。尤其是关闭这一步,很多人容易忘。

📌 总结一下:
  • 打开文件用 open(),记得指定模式和编码
  • 读取文件根据大小选方法,小文件用 read(),大文件用迭代
  • 写入文件注意 'w' 会覆盖,'a' 会追加
  • 关闭文件用 with 语句,省心又安全

好了,文件操作的基础就这些。你把这些练熟了,后面讲调试技巧时才能跟得上。记住,代码写得再漂亮,文件操作出问题,程序照样跑不起来。