1. 文件操作基础:理解Python中的持久化存储
在软件开发中,数据持久化是一个至关重要的概念。想象一下,你花了几个小时在程序中输入数据,结果关闭程序后所有信息都消失了——这种体验绝对令人沮丧。这就是为什么我们需要让程序具备"记忆"能力,而文件操作正是实现这一目标的基础。
Python提供了强大而灵活的文件操作功能,让我们能够轻松地将数据保存到磁盘,并在需要时重新读取。与内存中的临时存储不同,文件存储具有持久性,即使程序关闭或计算机重启,数据依然安全地保存在硬盘上。
提示:文件操作的核心原则是"打开-操作-关闭"。无论进行什么操作,都必须遵循这个流程,否则可能导致数据丢失或文件损坏。
1.1 文件操作的基本流程
每个文件操作都包含三个关键步骤:
- 打开文件:使用open()函数获取文件对象
- 进行操作:读取或写入内容
- 关闭文件:释放系统资源
这个流程看似简单,但每个步骤都有需要注意的细节。让我们通过一个实际例子来理解:
python复制# 正确的文件操作流程示例
try:
# 第一步:打开文件
file = open('example.txt', 'r', encoding='utf-8')
# 第二步:进行操作
content = file.read()
print(content)
finally:
# 第三步:关闭文件
if 'file' in locals():
file.close()
这个例子展示了最基本的文件操作流程,但实际开发中我们通常会使用更简洁安全的方式——with语句。
1.2 文件打开模式详解
打开文件时,我们需要指定操作模式。Python提供了多种模式,每种模式都有特定的用途和限制:
| 模式 | 描述 | 文件不存在时 | 指针位置 | 典型用途 |
|---|---|---|---|---|
| r | 只读 | 抛出错误 | 文件开头 | 读取现有文件 |
| w | 写入 | 创建新文件 | 文件开头 | 创建新文件或覆盖旧文件 |
| a | 追加 | 创建新文件 | 文件末尾 | 日志记录等追加场景 |
| r+ | 读写 | 抛出错误 | 文件开头 | 需要同时读写的情况 |
| w+ | 读写 | 创建新文件 | 文件开头 | 创建新文件并可能需要读取 |
| a+ | 读写 | 创建新文件 | 文件末尾 | 追加并可能需要读取 |
注意:模式后面加'b'表示二进制模式,如'rb'或'wb',用于处理非文本文件。
1.3 文件编码的重要性
处理文本文件时,编码是一个不能忽视的问题。错误的编码设置会导致乱码或读取失败。在Python 3中,推荐始终明确指定编码参数:
python复制# 推荐做法:明确指定编码
with open('example.txt', 'r', encoding='utf-8') as f:
content = f.read()
UTF-8是目前最通用的编码格式,它支持所有Unicode字符,包括各种语言的特殊字符和中文字符。如果不指定编码,Python会使用系统默认编码,这可能导致跨平台兼容性问题。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 文本文件操作实战
掌握了基础知识后,让我们深入探讨文本文件的具体操作方法。文本文件(.txt)是最基础也是最常用的文件格式之一,适用于存储配置信息、日志记录等各种场景。
2.1 读取文本文件的多种方式
Python提供了多种读取文本文件的方法,每种方法适用于不同的场景:
- read() - 一次性读取全部内容
- readline() - 逐行读取
- readlines() - 读取所有行并返回列表
- 迭代文件对象 - 内存友好的逐行读取
python复制# 不同读取方法的示例
with open('data.txt', 'r', encoding='utf-8') as f:
# 方法1:读取全部内容
content = f.read()
print("全部内容:", content)
# 重置文件指针
f.seek(0)
# 方法2:逐行读取
line = f.readline()
while line:
print("单行内容:", line.strip())
line = f.readline()
# 重置文件指针
f.seek(0)
# 方法3:读取所有行
lines = f.readlines()
print("所有行:", lines)
# 重置文件指针
f.seek(0)
# 方法4:迭代文件对象(推荐用于大文件)
for line in f:
print("迭代行:", line.strip())
选择哪种读取方法取决于具体需求:
- 小文件:可以使用read()或readlines()
- 大文件:推荐使用迭代或readline(),避免内存不足
- 需要随机访问:可以使用seek()配合read()
2.2 写入文本文件的技巧
写入文件同样有多种方法,最常用的是write()和writelines():
python复制# 写入文件示例
with open('output.txt', 'w', encoding='utf-8') as f:
# 方法1:write()写入字符串
f.write("第一行内容\n")
f.write("第二行内容\n")
# 方法2:writelines()写入字符串列表
lines = ["第三行内容\n", "第四行内容\n"]
f.writelines(lines)
写入文件时需要注意:
- 'w'模式会覆盖现有内容,使用前要确认
- 换行符(\n)需要手动添加
- 大量写入时可以考虑分批进行,避免内存问题
2.3 文件指针操作
文件指针决定了读写操作的位置,理解指针行为对文件操作至关重要:
python复制with open('example.txt', 'r+', encoding='utf-8') as f:
# 获取当前指针位置
print("初始位置:", f.tell())
# 读取前10个字符
content = f.read(10)
print("读取内容:", content)
print("读取后位置:", f.tell())
# 移动指针到文件开头
f.seek(0)
print("移动后位置:", f.tell())
# 在当前位置写入会覆盖原有内容
f.write("新内容")
# 验证写入结果
f.seek(0)
print("最终内容:", f.read())
关键点:
- tell()返回当前指针位置(字节偏移量)
- seek(offset, whence)移动指针
- whence=0: 从文件开头计算(默认)
- whence=1: 从当前位置计算
- whence=2: 从文件末尾计算
- 在'r+'模式下,写入会覆盖指针当前位置的内容
3. JSON数据持久化
虽然文本文件适合存储简单数据,但结构化数据的存储需要更强大的工具。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,非常适合Python程序的数据持久化需求。
3.1 JSON模块的核心功能
Python的json模块提供了四个主要函数:
| 函数 | 描述 | 常用场景 |
|---|---|---|
| json.dumps() | 将Python对象转为JSON字符串 | 需要将数据转换为字符串形式 |
| json.loads() | 将JSON字符串转为Python对象 | 解析JSON格式的字符串 |
| json.dump() | 将Python对象写入JSON文件 | 直接将数据保存到文件 |
| json.load() | 从JSON文件读取Python对象 | 从文件加载JSON数据 |
3.2 JSON文件读写示例
让我们看一个完整的JSON文件操作示例:
python复制import json
# 准备Python数据结构
data = {
"name": "张三",
"age": 30,
"courses": ["Python", "数据结构", "算法"],
"is_active": True
}
# 写入JSON文件
with open('user.json', 'w', encoding='utf-8') as f:
json.dump(data, f, ensure_ascii=False, indent=2)
#
