Python 文件 IO 入门:从读写文件开始掌握数据持久化
在编程的世界里,数据就像河流中的水,运行时存在于内存中,一旦程序结束,这些“水”就会消失。而文件 IO,就是把数据“存入水库”的过程。Python 文件 IO 是所有开发者必须掌握的核心技能之一。它不仅让你能读取配置文件、日志记录,还能处理 CSV、JSON 等常见格式,是连接程序与外部世界的重要桥梁。
对初学者来说,文件操作可能显得有些抽象,但其实它就像你每天用的“记事本”——打开、写入、保存、关闭。Python 提供了简洁而强大的 API 来完成这些操作,让复杂变得简单。
本文将带你从零开始,一步步掌握 Python 文件 IO 的核心用法,包括打开文件、读写模式、上下文管理器、异常处理以及常见文件格式的操作。无论你是刚接触 Python,还是想巩固基础,这篇内容都值得收藏。
文件打开与基本操作:理解模式与句柄
在 Python 中,所有文件操作都从 open() 函数开始。它的语法如下:
file_object = open(file_path, mode, encoding)
file_path:文件的路径,可以是相对路径(如data.txt)或绝对路径(如/home/user/data.txt)mode:打开模式,决定文件如何被使用encoding:编码格式,推荐始终指定,避免乱码问题
常见的模式有:
| 模式 | 含义 |
|---|---|
| r | 只读模式,文件必须存在 |
| w | 写入模式,会覆盖原有内容 |
| a | 追加模式,在文件末尾添加内容 |
| r+ | 读写模式,文件必须存在 |
| w+ | 读写模式,会清空原文件内容 |
| a+ | 读写追加模式,支持读和追加 |
💡 小贴士:你可以把文件想象成一本日记。
r是“只读”(看),w是“重写”(清空后写新内容),a是“追加”(在最后加新日记)。
示例代码:
file = open("example.txt", "r", encoding="utf-8")
content = file.read()
print(content)
file.close()
⚠️ 注意:
open()返回一个文件对象(也叫句柄),它是一个可迭代的资源。如果不关闭,系统资源可能被占用,导致后续无法访问文件。
读取文件的三种方式:read、readline 与 readlines
Python 提供了多种读取文件内容的方式,每种都有其适用场景。
read():一次性读取全部内容
适合读取小文件,如配置文件、说明文档。
with open("config.txt", "r", encoding="utf-8") as f:
data = f.read() # 一次性读取全部文本
print(data)
✅ 优点:简单直接
❌ 缺点:大文件会占用过多内存
readline():逐行读取
适合处理日志文件或逐行解析的文本。
with open("log.txt", "r", encoding="utf-8") as f:
line = f.readline() # 读取第一行
while line:
print("处理行:", line.strip()) # strip() 去除换行符
line = f.readline() # 继续读下一行
✅ 优点:内存占用小,适合大文件
❌ 缺点:代码稍显冗长
readlines():读取所有行到列表
适合需要对每一行做索引或条件判断的场景。
with open("students.txt", "r", encoding="utf-8") as f:
lines = f.readlines() # 返回一个包含所有行的列表
for i, line in enumerate(lines):
print(f"第 {i+1} 行: {line.strip()}")
✅ 优点:可随机访问某一行
❌ 缺点:大文件可能内存爆掉
写入文件:从创建到覆盖,掌握写入模式
写入文件是数据持久化的关键。根据需求选择合适的模式很重要。
使用 w 模式写入(覆盖)
with open("output.txt", "w", encoding="utf-8") as f:
f.write("这是第一行\n") # 写入文本,需手动加换行
f.write("这是第二行\n")
f.write("这是第三行")
💡 如果文件不存在,
w模式会自动创建;如果存在,则内容被清空。
使用 a 模式追加内容
with open("log.txt", "a", encoding="utf-8") as f:
f.write("\n[INFO] 程序启动成功\n")
f.write("[ERROR] 未找到配置文件\n")
✅ 适合日志记录、数据追加等场景
读写模式 r+ 与 w+
with open("data.txt", "r+", encoding="utf-8") as f:
content = f.read()
print("原内容:", content)
# 将光标移到文件开头,写入新内容
f.seek(0)
f.write("更新后的第一行\n")
f.write("第二行\n")
🔍
seek(0)用于将文件指针移动到开头。seek()是控制读写位置的关键方法。
上下文管理器 with:自动管理资源,安全可靠
在前面的示例中,我们使用了 with 语句。这是 Python 中处理文件 IO 的最佳实践。
with open("data.txt", "r", encoding="utf-8") as file:
content = file.read()
print(content)
✅ 优点:
- 无论程序是否出错,文件都会被正确关闭
- 代码更简洁,可读性更强
- 避免“忘记关闭文件”导致的资源泄漏
❗ 重要提醒:永远不要在
with外部使用文件对象!一旦with块结束,文件句柄就被释放。
异常处理:优雅应对文件不存在或权限问题
在真实环境中,文件可能不存在、权限不足、磁盘满等问题。必须进行异常处理。
try:
with open("nonexistent.txt", "r", encoding="utf-8") as f:
content = f.read()
print(content)
except FileNotFoundError:
print("错误:文件不存在,请检查路径是否正确")
except PermissionError:
print("错误:没有权限读取该文件")
except Exception as e:
print(f"发生未知错误:{e}")
🛠 常见异常类型:
FileNotFoundError:文件找不到PermissionError:权限不足IsADirectoryError:试图打开目录为文件UnicodeDecodeError:编码不匹配
✅ 建议:所有文件操作都应包裹在
try-except中,提升程序健壮性。
处理常见文件格式:CSV 与 JSON
实际项目中,你很少直接读写纯文本。更常见的是 CSV 和 JSON 文件。
读写 CSV 文件
import csv
with open("students.csv", "w", encoding="utf-8", newline="") as f:
writer = csv.writer(f)
writer.writerow(["姓名", "年龄", "城市"]) # 写入表头
writer.writerow(["张三", 20, "北京"])
writer.writerow(["李四", 22, "上海"])
with open("students.csv", "r", encoding="utf-8") as f:
reader = csv.reader(f)
for row in reader:
print(row) # 输出:['姓名', '年龄', '城市']
💡
newline=""是必须的,防止写入时出现多余空行。
读写 JSON 文件
import json
data = {
"name": "小明",
"age": 25,
"hobbies": ["读书", "游泳"]
}
with open("user.json", "w", encoding="utf-8") as f:
json.dump(data, f, ensure_ascii=False, indent=4)
# ensure_ascii=False 避免中文被转义
with open("user.json", "r", encoding="utf-8") as f:
loaded_data = json.load(f)
print(loaded_data["name"]) # 输出:小明
✅ JSON 是结构化数据交换的常用格式,适合配置文件、API 返回数据等。
总结:Python 文件 IO 的核心原则
Python 文件 IO 虽然看似简单,但背后蕴含着资源管理、异常处理、编码规范等重要思想。掌握它,意味着你真正开始与外部世界交互。
- 使用
with语句管理文件,避免资源泄漏 - 明确选择文件模式(r、w、a、r+ 等)
- 读写时指定
encoding="utf-8",避免乱码 - 对文件操作进行异常处理,提升程序稳定性
- 处理结构化数据时,优先使用
csv或json模块
🎯 最后提醒:Python 文件 IO 不只是“读写”,更是数据持久化、程序间通信的基础能力。多练习,多写代码,你很快就能成为文件操作的高手。
当你能熟练处理各种文件格式,理解文件句柄、编码、异常机制时,你就已经迈出了从“会写代码”到“写好代码”的关键一步。继续加油!