从零学 Python 系列(六):文件操作,让数据 “永久保存”
一、文件操作基础:打开、读写、关闭
操作文件的流程很固定,就像 “写信”:先打开信封(打开文件),再写入内容(写文件)或读取内容(读文件),最后封上信封(关闭文件)。
1. 打开文件:用 open () 函数
Python 用open()函数打开文件,语法是:
文件对象 = open(文件路径, 打开模式)
- 文件路径:可以是 “相对路径”(相对于当前程序的位置)或 “绝对路径”(比如
C:\data\test.txt); - 打开模式:决定文件能做什么(读、写、追加等),常用的有 3 种:
'r':只读(默认模式,文件不存在会报错);'w':只写(文件不存在会创建,存在则清空原有内容);'a':追加(文件不存在会创建,新内容加在原有内容后面)。
示例:
# 打开当前文件夹下的test.txt,只读模式
f = open("test.txt", "r")
# 打开D盘data文件夹下的info.txt,写入模式(注意路径中的斜杠用/或\\)
f = open("D:/data/info.txt", "w") # 推荐用/,避免转义问题
2. 关闭文件:用 close () 函数
打开文件后必须关闭,否则可能导致数据丢失或文件被占用。有两种方式关闭:
(1)手动关闭(用 close ())
f = open("test.txt", "w")
# 操作文件...
f.close() # 必须关闭
(2)自动关闭(推荐!用 with 语句)
with语句会在操作完成后自动关闭文件,不用担心忘记close()。
with open("test.txt", "w") as f: # 用as给文件对象起别名f
# 操作文件...(缩进部分)
f.write("Hello, 文件操作!") # 写入内容
# 离开with块后,文件自动关闭
强烈推荐用with语句,尤其是新手,能避免很多因 “忘记关闭文件” 导致的问题。
二、读写文本文件(.txt):最基础的文件操作
文本文件(.txt)是最常见的文件格式,适合存简单的文字数据(比如日志、备注)。
1. 写文件:用 write () 或 writelines ()
write(内容):写入单个字符串;writelines(列表):写入多个字符串(列表中的元素)。
(1)覆盖写入('w' 模式)
# 写入单行内容
with open("note.txt", "w", encoding="utf-8") as f: # 指定encoding="utf-8"避免中文乱码
f.write("这是我的第一行笔记\n") # \n表示换行
f.write("今天学习了Python文件操作\n")
# 写入多行内容(用列表)
lines = ["第一行\n", "第二行\n", "第三行\n"]
with open("lines.txt", "w", encoding="utf-8") as f:
f.writelines(lines)
- 注意:
'w'模式会清空文件原有内容,所以如果只是想 “添加内容”,要用'a'模式。
(2)追加内容('a' 模式)
with open("note.txt", "a", encoding="utf-8") as f: # 追加模式
f.write("这是追加的内容,不会覆盖之前的文字\n")
运行后,note.txt的内容会变成:
这是我的第一行笔记
今天学习了Python文件操作
这是追加的内容,不会覆盖之前的文字
2. 读文件:用 read ()、readline () 或 readlines ()
根据需要读取的内容(全部、单行、多行),选择不同的方法:
(1)读全部内容(read ())
with open("note.txt", "r", encoding="utf-8") as f:
content = f.read() # 读取所有内容,返回一个字符串
print("文件全部内容:")
print(content)
(2)读一行内容(readline ())
with open("note.txt", "r", encoding="utf-8") as f:
line1 = f.readline() # 读第一行
line2 = f.readline() # 读第二行
print("第一行:", line1)
print("第二行:", line2)
(3)读所有行(readlines ())
with open("note.txt", "r", encoding="utf-8") as f:
lines = f.readlines() # 读取所有行,返回列表(每行是一个元素)
print("所有行:", lines)
# 遍历列表打印
for i, line in enumerate(lines, 1):
print(f"第{i}行:{line}")
三、读写 CSV 文件(.csv):用表格格式存结构化数据
CSV 文件(逗号分隔值)是一种类似 Excel 的表格格式,适合存结构化数据(比如学生信息表、销售记录),比 txt 更规范,还能被 Excel 直接打开。
1. 用 Python 内置的 csv 模块操作 CSV
Python 自带csv模块,专门处理 CSV 文件,支持读写行、指定表头(列名)等。
(1)写入 CSV 文件(带表头)
import csv # 导入csv模块
# 学生数据:列表套列表(每个子列表是一行数据)
students = [
["姓名", "年龄", "成绩"], # 表头
["张三", 18, 85],
["李四", 19, 92],
["王五", 18, 78]
]
# 写入CSV
with open("students.csv", "w", encoding="utf-8", newline="") as f:
# 创建csv写入对象
writer = csv.writer(f)
# 写入所有行(也可以用writerow()单行写入)
writer.writerows(students)
print("CSV文件写入完成!")
运行后会生成students.csv,用 Excel 打开会显示:
| 姓名 | 年龄 | 成绩 |
|---|---|---|
| 张三 | 18 | 85 |
| 李四 | 19 | 92 |
| 王五 | 18 | 78 |
(2)读取 CSV 文件
import csv
with open("students.csv", "r", encoding="utf-8") as f:
# 创建csv读取对象
reader = csv.reader(f)
# 遍历读取每一行
for i, row in enumerate(reader):
if i == 0:
print("表头:", row)
else:
print(f"第{i}行数据:", row)
运行结果:
表头: ['姓名', '年龄', '成绩']
第1行数据: ['张三', '18', '85']
第2行数据: ['李四', '19', '92']
第3行数据: ['王五', '18', '78']
2. 用 pandas 读写 CSV(更简单,推荐)
如果处理大量 CSV 数据,用pandas库会更高效(需要先安装:pip install pandas)。
(1)写入 CSV(用 DataFrame)
import pandas as pd
# 创建DataFrame(类似表格)
data = {
"姓名": ["张三", "李四", "王五"],
"年龄": [18, 19, 18],
"成绩": [85, 92, 78]
}
df = pd.DataFrame(data)
# 写入CSV(index=False表示不保存索引列)
df.to_csv("students_pd.csv", encoding="utf-8", index=False)
print("pandas写入CSV完成!")
(2)读取 CSV
import pandas as pd
# 读取CSV
df = pd.read_csv("students_pd.csv", encoding="utf-8")
print("读取的CSV数据:")
print(df)
# 可以直接获取某一列数据
print("\n所有学生的成绩:", df["成绩"].tolist())
运行结果:
读取的CSV数据:
姓名 年龄 成绩
0 张三 18 85
1 李四 19 92
2 王五 18 78
所有学生的成绩: [85, 92, 78]
四、实战:学生信息管理系统(带文件存储)
综合文件操作和之前学的函数、字典,升级 “学生信息管理系统”,实现数据永久保存(用 CSV 文件存储)。
完整代码:
import csv
# 函数:加载学生数据(从CSV文件)
def load_students(filename):
students = []
try:
with open(filename, "r", encoding="utf-8") as f:
reader = csv.DictReader(f) # 按字典方式读取(表头为键)
for row in reader:
# 转换数据类型(CSV读出来的都是字符串)
student = {
"name": row["name"],
"age": int(row["age"]),
"score": float(row["score"])
}
students.append(student)
print(f"已从{filename}加载{len(students)}条学生数据")
except FileNotFoundError:
print(f"{filename}不存在,将创建新文件")
return students
# 函数:保存学生数据(到CSV文件)
def save_students(filename, students):
with open(filename, "w", encoding="utf-8", newline="") as f:
# 定义表头
fieldnames = ["name", "age", "score"]
writer = csv.DictWriter(f, fieldnames=fieldnames)
writer.writeheader() # 写表头
writer.writerows(students) # 写所有行
print(f"已将{len(students)}条学生数据保存到{filename}")
# 主程序
def main():
filename = "students.csv"
students = load_students(filename) # 加载已有数据
while True:
print("\n=== 学生信息管理系统(带文件存储) ===")
print("1. 添加学生")
print("2. 显示所有学生")
print("3. 保存并退出")
choice = input("请选择操作:")
if choice == "1":
name = input("请输入姓名:")
age = int(input("请输入年龄:"))
score = float(input("请输入成绩:"))
students.append({"name": name, "age": age, "score": score})
print(f"已添加学生:{name}")
elif choice == "2":
if not students:
print("暂无学生数据")
else:
print("所有学生信息:")
for i, s in enumerate(students, 1):
print(f"{i}. 姓名:{s['name']},年龄:{s['age']},成绩:{s['score']}")
elif choice == "3":
save_students(filename, students)
print("退出系统,再见!")
break
else:
print("输入错误,请重新选择")
if __name__ == "__main__":
main()
功能说明:
- 程序启动时,从
students.csv加载已有数据(如果文件不存在,会创建新文件); - 添加学生后,数据先存在内存的列表中;
- 选择 “保存并退出” 时,才会把所有数据写入 CSV 文件,实现永久保存;
- 下次启动程序,会自动读取上次保存的数据。
下一篇预告:异常处理与调试,让代码更 “健壮”
学会了文件操作,程序能 “记忆” 数据了,但还有一个问题:如果用户输入错误(比如输入文字却要求是数字)、文件被删除,程序会直接崩溃并报错。下一篇会带你学习 “异常处理”,让程序遇到错误时能友好提示并继续运行;还会教你简单的调试技巧,快速找到代码中的 bug。
如果这篇的文件操作案例对你有帮助,欢迎在评论区分享你的实践:比如你用文件存储了什么数据,或者遇到了哪些读写问题,我们一起解决~
更多推荐


所有评论(0)