AI编程(九):文件操作 — 让数据存下来

作者:

用抽屉类比理解文件读写

辛辛苦苦输入的数据,关掉程序就没了?

上一篇我们学会了用列表和字典来组织数据——通讯录、成绩单、购物清单,都可以用程序来管理了。但你有没有发现一个问题?

每次运行程序,你辛辛苦苦输入了10个联系人,结果一关程序,全没了

下次再打开,又得从头输入。

这就像你在纸上记了一堆笔记,下班的时候把纸扔了,第二天又得重新记。

所以我们需要一个能力:把数据”存下来”。 存到电脑的文件里,这样不管程序开还是关,数据都在。

这就是”文件操作”——Python读写文件的能力。

用”抽屉”来理解文件操作

文件操作其实特别简单,我们用一个你每天都在用的东西来类比:抽屉

你的动作 抽屉的动作 Python的代码

|—|—|—|

打开抽屉 拉开,准备放东西或拿东西 open("文件名")
从抽屉里拿东西 读取里面的内容 文件.read()
往抽屉里放东西 写入新的内容 文件.write("内容")
关上抽屉 推回去,整理好 文件.close()

就这么简单。整个文件操作就是四步:

  1. 打开抽屉open()
  2. 拿东西或放东西read()write()
  3. 关上抽屉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,让你的程序像有了”防弹衣”,遇到问题不会死机,而是优雅地告诉你出了什么事、该怎么解决。

下一篇:AI编程10-错误处理

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注