用抽屉类比理解文件读写
辛辛苦苦输入的数据,关掉程序就没了?
上一篇我们学会了用列表和字典来组织数据——通讯录、成绩单、购物清单,都可以用程序来管理了。但你有没有发现一个问题?
每次运行程序,你辛辛苦苦输入了10个联系人,结果一关程序,全没了。
下次再打开,又得从头输入。
这就像你在纸上记了一堆笔记,下班的时候把纸扔了,第二天又得重新记。
所以我们需要一个能力:把数据”存下来”。 存到电脑的文件里,这样不管程序开还是关,数据都在。
这就是”文件操作”——Python读写文件的能力。
用”抽屉”来理解文件操作
文件操作其实特别简单,我们用一个你每天都在用的东西来类比:抽屉。
| 你的动作 | 抽屉的动作 | Python的代码 |
|---|
|—|—|—|
| 打开抽屉 | 拉开,准备放东西或拿东西 | open("文件名") |
|---|---|---|
| 从抽屉里拿东西 | 读取里面的内容 | 文件.read() |
| 往抽屉里放东西 | 写入新的内容 | 文件.write("内容") |
| 关上抽屉 | 推回去,整理好 | 文件.close() |
就这么简单。整个文件操作就是四步:
- 打开抽屉 —
open() - 拿东西或放东西 —
read()或write() - 关上抽屉 —
close()
读文件:从抽屉里拿东西
假设你有一个文件叫 日记.txt,里面写着:
今天天气真好
去公园散了步
晚上吃了火锅
用Python读取它:
# 第一步:打开抽屉
f = open("日记.txt", "r") # "r" 表示 read(读)
# 第二步:从抽屉里拿出所有东西
内容 = f.read()
print(内容)
# 第三步:关上抽屉
f.close()
运行后,你就能看到文件里的三行文字了。
三种”拿东西”的方式
从抽屉里拿东西,你可以选择不同的拿法:
f = open("日记.txt", "r")
# 方式一:一次性全拿出来
全部 = f.read() # 拿到整个文件的内容
# 方式二:每次拿一行
第一行 = f.readline() # 只拿第一行
# 方式三:全部拿出来,但按行分成一个列表
所有行 = f.readlines() # ['今天天气真好n', '去公园散了步n', '晚上吃了火锅n']
f.close()
什么时候用哪个?
- 文件很小 → 用
read(),一次性搞定 - 文件很大,只想逐行处理 → 用
readline()或直接用for循环遍历 - 想拿到一个行的列表 → 用
readlines()
写文件:往抽屉里放东西
往文件里写内容,也是一样的流程:
# 打开抽屉("w" 表示 write,写入模式)
f = open("购物清单.txt", "w")
# 往里面放东西
f.write("牛奶n") # n 是换行符,就像你写字时换了一行
f.write("面包n")
f.write("鸡蛋n")
# 关上抽屉
f.close()
运行后,你会发现目录下多了一个 购物清单.txt,打开看看:
牛奶
面包
鸡蛋
⚠️ 重要提醒:”w”模式会清空重写!
open("文件.txt", "w") 会把抽屉里的东西全部倒掉,再放新的。
如果你只想追加内容(在原有内容后面加),要用 "a" 模式(append,追加):
f = open("购物清单.txt", "a") # "a" = append,追加
f.write("酸奶n") # 在已有的三行后面,再加上酸奶
f.close()
这样购物清单就变成四行了,原来的牛奶、面包、鸡蛋还在。
with 语句:自动关抽屉
老实说,上面每次都要写 f.close() 有点麻烦。万一你忘了关呢?就像抽屉一直开着,不太安全。
Python有一个贴心的语法——with 语句,它能帮你自动关抽屉:
# 读文件
with open("日记.txt", "r") as f:
内容 = f.read()
print(内容)
# 离开 with 的缩进区域后,Python自动帮你调用了 f.close()
# 写文件
with open("笔记.txt", "w") as f:
f.write("今天的收获:学会了文件操作n")
f.write("文件 = 抽屉n")
# 自动关闭,不用操心
建议:以后写文件操作,一律用 with 语句。 省心、安全、不会忘。
CSV 文件:给表格数据用的抽屉
你用过Excel表格吧?一行一行的数据,有表头、有数据行。在Python里,这种表格数据通常用 CSV文件 来存储(CSV = Comma-Separated Values,用逗号分隔的值)。
姓名,年龄,城市
张三,25,北京
李四,30,上海
王五,28,广州
Python自带了 csv 模块,专门处理这种表格文件:
读CSV
import csv
with open("通讯录.csv", "r", encoding="utf-8") as f:
reader = csv.reader(f)
for 行 in reader:
print(行)
输出:
['姓名', '年龄', '城市']
['张三', '25', '北京']
['李四', '30', '上海']
['王五', '28', '广州']
每一行都是一个列表,用逗号分隔开了。
写CSV
import csv
with open("成绩表.csv", "w", encoding="utf-8", newline="") as f:
writer = csv.writer(f)
writer.writerow(["姓名", "语文", "数学", "英语"]) # 写表头
writer.writerow(["小明", 90, 85, 92])
writer.writerow(["小红", 88, 95, 78])
newline="" 是为了避免Windows下多出空行的小问题,加上没错。
JSON 文件:给字典和列表用的抽屉
上一篇我们学了字典和列表。如果你想把一个字典或列表完整地保存到文件里,再完整地读回来——用 JSON 最方便。
JSON 是一种通用的数据格式,长得像这样:
{
"姓名": "张三",
"年龄": 25,
"爱好": ["读书", "跑步"]
}
存储数据到JSON文件
import json
通讯录 = {
"张三": {"电话": "13800001111", "城市": "北京"},
"李四": {"电话": "13900002222", "城市": "上海"}
}
with open("通讯录.json", "w", encoding="utf-8") as f:
json.dump(通讯录, f, ensure_ascii=False, indent=2)
ensure_ascii=False 让中文正常显示(不会变成 u5f20u4e09),indent=2 让文件格式好看、方便人类阅读。
从JSON文件读取数据
import json
with open("通讯录.json", "r", encoding="utf-8") as f:
通讯录 = json.load(f)
print(通讯录)
# {'张三': {'电话': '13800001111', '城市': '北京'}, '李四': {'电话': '13900002222', '城市': '上海'}}
一进一出,数据完整还原。 就像把东西放抽屉里,第二天打开,东西还在原来的位置。
实战:通讯录文件版
学了这么多,来做个小项目:一个能保存数据的通讯录程序。
之前我们做的通讯录,一关程序数据就没了。现在加上文件操作,数据可以持久保存。
import json
文件名 = "我的通讯录.json"
# --- 读取:启动时从文件加载数据 ---
def 读取通讯录():
try:
with open(文件名, "r", encoding="utf-8") as f:
return json.load(f)
except FileNotFoundError:
return {} # 文件不存在,说明是第一次用,返回空字典
# --- 保存:每次修改后存入文件 ---
def 保存通讯录(通讯录):
with open(文件名, "w", encoding="utf-8") as f:
json.dump(通讯录, f, ensure_ascii=False, indent=2)
# --- 主程序 ---
通讯录 = 读取通讯录() # 启动时自动加载上次的数据
while True:
print("n=== 通讯录 ===")
print("1. 查看所有联系人")
print("2. 添加联系人")
print("3. 搜索联系人")
print("4. 退出")
选择 = input("请选择(1-4):")
if 选择 == "1":
if not 通讯录:
print("通讯录为空,快去添加联系人吧!")
else:
for 名字, 信息 in 通讯录.items():
print(f" {名字}:{信息['电话']},{信息['城市']}")
elif 选择 == "2":
名字 = input("姓名:")
电话 = input("电话:")
城市 = input("城市:")
通讯录[名字] = {"电话": 电话, "城市": 城市}
保存通讯录(通讯录) # 添加后立即保存
print(f"✅ 已添加 {名字},数据已保存到文件!")
elif 选择 == "3":
关键字 = input("输入要搜索的姓名:")
if 关键字 in 通讯录:
信息 = 通讯录[关键字]
print(f" {关键字}:{信息['电话']},{信息['城市']}")
else:
print(" 找不到这个人。")
elif 选择 == "4":
print("再见!数据已经保存在文件里,下次打开还在。")
break
试一试:运行程序,添加几个联系人,然后退出。再重新运行——数据还在! 这就是文件操作的魔力。
小结
| 概念 | 作用 | 抽屉类比 |
|---|
|—|—|—|
open("文件", "r") |
打开文件读取 | 打开抽屉看东西 |
|---|---|---|
open("文件", "w") |
打开文件写入 | 清空抽屉再放东西 |
open("文件", "a") |
打开文件追加 | 往抽屉里再塞东西 |
with open() as f: |
自动关闭文件 | 自动关抽屉,不用操心 |
csv 模块 |
读写表格数据 | 专用的表格格子抽屉 |
json 模块 |
读写字典/列表 | 万能收纳抽屉 |
记住两个核心: 用 with 打开文件,用 json 保存结构化数据。掌握了这两点,90%的文件操作你都会了。
下篇预告
《AI编程(十):错误处理 —— 让程序不再”一碰就碎”》
程序运行时总会遇到意外——文件不存在、用户输入了字母却期望数字、网络突然断了……这些”错误”如果不处理,程序就会直接崩溃。下一篇我们学习 try-except,让你的程序像有了”防弹衣”,遇到问题不会死机,而是优雅地告诉你出了什么事、该怎么解决。
发表回复