Python文件与数据持久化完全教程:txt/csv/json/Excel操作实战

数据持久化是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')
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容