数据持久化是Python编程的核心基础能力,指将程序运行中的临时数据保存到文件或数据库中,实现数据长期存储与复用。本文系统讲解Python中最常用的文件操作(txt)、结构化数据存储(csv/json)、表格文件处理(Excel)的核心方法,覆盖从基础读写到进阶实战的全流程,适合零基础入门与工程应用参考。
一、基础文件操作:TXT文件读写(open()函数)
TXT文件是最通用的文本存储格式,Python通过内置的open()函数实现TXT文件的创建、读取、写入,无需安装第三方库,是数据持久化的入门基础。
1. 核心语法与模式
基础语法:打开文件→操作→关闭文件
文件对象 = open(文件路径, 打开模式, encoding='utf-8')
执行读写操作
文件对象.close() 必须关闭文件,释放资源
推荐语法:with语句(自动关闭文件,避免资源泄漏)
with open(文件路径, 打开模式, encoding='utf-8') as f:
执行读写操作
pass 代码块结束后自动关闭文件
关键打开模式(必背):
| 模式 | 说明 | 适用场景 |
|---|---|---|
| r | 只读模式(默认),文件不存在则报错 | 读取已有文件内容 |
| w | 写入模式,文件不存在则创建,存在则覆盖 | 新建/重写文件 |
| a | 追加模式,文件不存在则创建,内容追加到末尾 | 补充写入文件(不覆盖原有内容) |
| r+ | 读写模式,文件不存在则报错 | 读取并修改文件 |
| w+ | 读写模式,文件不存在则创建,存在则覆盖 | 新建文件并读写 |
| a+ | 追加+读取模式,文件不存在则创建 | 追加内容并读取文件 |
2. 实战示例
示例1:写入TXT文件
方式1:基础写法(需手动关闭)
f = open('data.txt', 'w', encoding='utf-8')
f.write('Python文件操作\n') 写入单行字符串
f.write('数据持久化教程\n')
f.close() 必须关闭
方式2:with语句(推荐)
with open('data.txt', 'a', encoding='utf-8') as f:
f.write('追加的内容\n') 追加到文件末尾
写入多行(列表)
lines = ['第一行数据\n', '第二行数据\n', '第三行数据\n']
f.writelines(lines)
生成的data.txt内容:
Python文件操作
数据持久化教程
追加的内容
第一行数据
第二行数据
第三行数据
示例2:读取TXT文件
读取全部内容
with open('data.txt', 'r', encoding='utf-8') as f:
content = f.read() 一次性读取所有内容
print('全部内容:\n', content)
逐行读取(适合大文件,节省内存)
with open('data.txt', 'r', encoding='utf-8') as f:
print('\n逐行读取:')
for line in f:
print(line.strip()) strip()去除换行符和空格
运行效果:
全部内容:
Python文件操作
数据持久化教程
追加的内容
第一行数据
第二行数据
第三行数据
逐行读取:
Python文件操作
数据持久化教程
追加的内容
第一行数据
第二行数据
第三行数据
3. 注意事项
- 操作中文文件必须指定
encoding='utf-8',否则会出现乱码; - 大文件读取禁止使用
read()(一次性加载到内存),优先用for line in f逐行读取; - 写入时换行符
\n需手动添加,writelines()不会自动加换行; - 路径推荐使用绝对路径(如
D:/python/data.txt)或项目相对路径,避免路径错误。
二、结构化数据:CSV文件读写(csv模块)
CSV(逗号分隔值)是表格类数据的标准存储格式,兼容Excel、数据库等工具,Python内置csv模块专门处理CSV文件,无需第三方库。
1. 核心语法
import csv 导入内置csv模块
写入CSV
with open(文件路径, 'w', newline='', encoding='utf-8') as f:
writer = csv.writer(f) 创建写入对象
writer.writerow(单行数据) 写入单行(列表/元组)
writer.writerows(多行数据) 写入多行(列表嵌套列表)
读取CSV
with open(文件路径, 'r', encoding='utf-8') as f:
reader = csv.reader(f) 创建读取对象
for row in reader: 逐行读取
print(row)
⚠️ 写入时必须加newline='',否则会出现空行。
2. 实战示例
示例1:写入CSV(学生成绩表)
import csv
数据准备
header = ['姓名', '语文', '数学', '英语']
data = [
['张三', 85, 92, 78],
['李四', 76, 88, 95],
['王五', 91, 84, 89]
]
写入CSV
with open('score.csv', 'w', newline='', encoding='utf-8') as f:
writer = csv.writer(f)
writer.writerow(header) 写入表头
writer.writerows(data) 写入数据行
print('CSV文件写入完成!')
生成的score.csv内容:
姓名,语文,数学,英语
张三,85,92,78
李四,76,88,95
王五,91,84,89
示例2:读取CSV并计算平均分
import csv
total_chinese = 0
count = 0
with open('score.csv', 'r', encoding='utf-8') as f:
reader = csv.reader(f)
header = next(reader) 跳过表头
print('表头:', header)
for row in reader:
name = row[0]
chinese = int(row[1])
math = int(row[2])
english = int(row[3])
avg = (chinese + math + english) / 3
print(f'{name} 平均分:{avg:.1f}')
total_chinese += chinese
count += 1
print(f'语文平均分:{total_chinese/count:.1f}')
运行效果:
表头: ['姓名', '语文', '数学', '英语']
张三 平均分:85.0
李四 平均分:86.3
王五 平均分:88.0
语文平均分:84.0
3. 进阶:字典格式读写(更易维护)
import csv
字典写入
with open('score_dict.csv', 'w', newline='', encoding='utf-8') as f:
fieldnames = ['姓名', '语文', '数学']
writer = csv.DictWriter(f, fieldnames=fieldnames)
writer.writeheader() 写入表头
writer.writerow({'姓名': '赵六', '语文': 88, '数学': 90})
writer.writerow({'姓名': '孙七', '语文': 79, '数学': 85})
字典读取
with open('score_dict.csv', 'r', encoding='utf-8') as f:
reader = csv.DictReader(f)
for row in reader:
print(f"姓名:{row['姓名']},语文:{row['语文']}")
三、轻量级序列化:JSON文件读写(json模块)
JSON是跨语言的数据交换格式,适合存储嵌套结构(如字典、列表),Python内置json模块实现JSON数据的序列化(Python→JSON)和反序列化(JSON→Python)。
1. 核心语法
import json 导入内置json模块
序列化:Python对象→JSON文件
with open(文件路径, 'w', encoding='utf-8') as f:
json.dump(数据对象, f, ensure_ascii=False, indent=4)
反序列化:JSON文件→Python对象
with open(文件路径, 'r', encoding='utf-8') as f:
数据对象 = json.load(f)
参数说明:
-
ensure_ascii=False:支持中文显示(必加); -
indent=4:格式化输出,增强可读性(可选)。
2. 实战示例
示例1:写入JSON(嵌套结构数据)
import json
嵌套结构数据(字典+列表)
user_data = {
'user_id': 1001,
'name': '张三',
'age': 25,
'hobbies': ['编程', '阅读', '运动'],
'scores': {
'Python': 95,
'Java': 88
}
}
写入JSON文件
with open('user.json', 'w', encoding='utf-8') as f:
json.dump(user_data, f, ensure_ascii=False, indent=4)
print('JSON文件写入完成!')
生成的user.json内容(格式化后):
{
"user_id": 1001,
"name": "张三",
"age": 25,
"hobbies": [
"编程",
"阅读",
"运动"
],
"scores": {
"Python": 95,
"Java": 88
}
}
示例2:读取JSON并解析数据
import json
读取JSON文件
with open('user.json', 'r', encoding='utf-8') as f:
data = json.load(f)
解析数据
print(f"用户ID:{data['user_id']}")
print(f"姓名:{data['name']}")
print(f"第一个爱好:{data['hobbies'][0]}")
print(f"Python成绩:{data['scores']['Python']}")
修改数据后重新写入
data['age'] = 26 修改年龄
data['hobbies'].append('摄影') 添加爱好
with open('user.json', 'w', encoding='utf-8') as f:
json.dump(data, f, ensure_ascii=False, indent=4)
print('数据修改并重新写入完成!')
运行效果:
用户ID:1001
姓名:张三
第一个爱好:编程
Python成绩:95
数据修改并重新写入完成!
3. 适用场景
- 存储嵌套结构数据(如接口返回数据、配置文件);
- 跨语言数据交互(如Python与前端/后端的数据传输);
- 配置文件(如
config.json存储程序参数)。
四、表格文件进阶:Excel读写(openpyxl库)
Excel是办公场景最常用的表格格式,Python需安装第三方库openpyxl(支持.xlsx格式)实现Excel文件的读写,是工程与办公自动化的核心技能。
1. 环境准备
安装openpyxl库
pip install openpyxl
2. 核心语法
from openpyxl import Workbook 新建Excel
from openpyxl import load_workbook 读取已有Excel
新建Excel并写入
wb = Workbook()
ws = wb.active 获取活动工作表
ws['A1'] = '内容' 单元格赋值
ws.append(行数据) 追加行
wb.save(文件路径) 保存文件
读取Excel
wb = load_workbook(文件路径)
ws = wb.active
cell_value = ws['A1'].value 获取单元格值
for row in ws.iter_rows(values_only=True): 逐行读取
print(row)
wb.close() 关闭文件
3. 实战示例
示例1:新建Excel并写入数据
from openpyxl import Workbook
新建工作簿
wb = Workbook()
ws = wb.active
ws.title = '学生成绩' 修改工作表名称
写入表头
ws.append(['姓名', '语文', '数学', '英语', '平均分'])
写入数据行
students = [
['张三', 85, 92, 78],
['李四', 76, 88, 95],
['王五', 91, 84, 89]
]
for student in students:
计算平均分
avg = (student[1] + student[2] + student[3]) / 3
student.append(round(avg, 1)) 保留1位小数
ws.append(student)
保存文件
wb.save('student_score.xlsx')
print('Excel文件创建完成!')
示例2:读取Excel并修改数据
from openpyxl import load_workbook
读取已有Excel文件
wb = load_workbook('student_score.xlsx')
ws = wb['学生成绩'] 指定工作表
读取单元格值
print(f"A1单元格:{ws['A1'].value}")
print(f"张三的数学成绩:{ws['C2'].value}")
逐行读取所有数据
print('\n所有数据:')
for row in ws.iter_rows(values_only=True):
print(row)
修改数据:张三的语文成绩+2
ws['B2'] = 87
重新计算平均分
ws['E2'] = (87 + 92 + 78) / 3
保存修改
wb.save('student_score.xlsx')
wb.close()
print('Excel数据修改完成!')
4. 注意事项
-
openpyxl仅支持.xlsx格式,不支持.xls(老旧格式); - 写入大量数据时,优先用
ws.append()而非逐个单元格赋值,提升效率; - 读取文件后必须用
wb.close()关闭,或使用with语句:with load_workbook('file.xlsx') as wb: ws = wb.active 操作数据
五、数据持久化方式对比与场景选择
| 格式/方法 | 核心特点 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|---|
| TXT | 纯文本、无格式 | 简单文本存储、日志记录 | 通用、无需解析、体积小 | 无结构化、解析复杂数据麻烦 |
| CSV | 逗号分隔、表格结构 | 批量结构化数据、与Excel/数据库交互 | 轻量、易解析、兼容性强 | 不支持嵌套结构、无格式 |
| JSON | 嵌套结构、跨语言 | 配置文件、接口数据、嵌套数据 | 易解析、支持复杂结构、跨语言 | 不支持表格公式、大数据效率低 |
| Excel | 表格格式、支持公式/样式 | 办公报表、可视化表格、带格式的数据 | 支持公式/样式、易阅读 | 需第三方库、体积大、解析慢 |
选择建议:
- 简单文本记录 → TXT;
- 批量表格数据(无格式)→ CSV;
- 嵌套/复杂结构数据 → JSON;
- 办公场景/带格式表格 → Excel。
六、实战案例:综合数据处理
以下案例实现“读取CSV数据 → 处理计算 → 分别保存为JSON和Excel”的完整流程:
import csv
import json
from openpyxl import Workbook
1. 读取CSV学生成绩数据
csv_data = []
with open('score.csv', 'r', encoding='utf-8') as f:
reader = csv.DictReader(f)
for row in reader:
转换数据类型(字符串→数值)
row['语文'] = int(row['语文'])
row['数学'] = int(row['数学'])
row['英语'] = int(row['英语'])
计算总分
row['总分'] = row['语文'] + row['数学'] + row['英语']
csv_data.append(row)
2. 保存为JSON文件
with open('score_total.json', 'w', encoding='utf-8') as f:
json.dump(csv_data, f, ensure_ascii=False, indent=4)
3. 保存为Excel文件
wb = Workbook()
ws = wb.active
ws.title = '成绩汇总'
写入表头
headers = ['姓名', '语文', '数学', '英语', '总分']
ws.append(headers)
写入数据
for row in csv_data:
ws.append([
row['姓名'],
row['语文'],
row['数学'],
row['英语'],
row['总分']
])
wb.save('score_total.xlsx')
wb.close()
print('数据处理完成!已生成score_total.json和score_total.xlsx')