agentmentoragentmentor

第 07 节:让程序留下痕迹:读写文本文件

本节 objectives:

  • with open(...) 读取文本文件
  • 把列表数据写回文本文件
  • 用一行一条记录的格式保存简单数据

先修:字符串、列表、循环、函数 | 上一节 << 06 | 下一节 08 >>

程序一结束,变量就消失了

前面写的任务列表都活在本次运行的内存里。脚本结束后,变量没有自动保存。要让小程序记住数据,最朴素的办法是把文本写进文件,下次运行时再读回来。Python 教程介绍 open() 读写文件,并推荐用 with 确保代码块结束后文件被关闭1

本课先用纯文本,不用数据库。因为现在目标是看懂“保存”和“恢复”的机制。

讲解

读取文件得到字符串。 f.read() 会读取文件内容;f.readlines() 会得到多行。读出来通常还要去掉末尾换行。

写入模式会覆盖文件。 open(path, "w") 用写入模式打开文件,会把原内容替换成新内容。做练习时先用小测试文件。

with 管理关闭动作。 with open(...) as f: 让文件对象只在缩进块里使用;离开代码块后文件会关闭1

简单格式先一行一条。 对待办标题这种小数据,每行一个标题已经够用。复杂字段可以以后再学 JSON。

跟我做一遍(worked example)

把任务标题写入 tasks.txt,再读回来:

python
tasks = ["read docs", "write script"]
with open("tasks.txt", "w", encoding="utf-8") as f:    for task in tasks:        f.write(task + "\n")
loaded = []with open("tasks.txt", "r", encoding="utf-8") as f:    for line in f:        loaded.append(line.strip())
print(loaded)

写入时手动加 \n,读取时用 strip() 去掉换行。这样内存里的列表和文件里的多行文本能互相转换。

换你补全(faded example)

补全读取函数:

python
def load_tasks(path):    tasks = []    with open(path, "r", encoding="utf-8") as f:        for line in f:            tasks.append(line.____())    return tasks

答案:

python
def load_tasks(path):    tasks = []    with open(path, "r", encoding="utf-8") as f:        for line in f:            tasks.append(line.strip())    return tasks

关键判断点是:文件行尾的换行符不是任务标题的一部分。

小结 + 通向下一节

文件读写让脚本有了记忆。最后一节把运行、分支、循环、函数、列表和文件连起来,做一个小 CLI。

Footnotes

  1. Python Tutorial: Input and Output — https://docs.python.org/3/tutorial/inputoutput.html 2

练习

Level 1: 写入三行文本。

  • 做法:创建 notes.txt,写入三条学习笔记,每条一行。
提示 1

先用一个不重要的测试文件。 Level 2: 读文件并编号显示。

  • 做法:读取 notes.txt,输出 1. ...2. ...
提示 2

可以用一个 number 变量从 1 累加。

看参考答案

读取、清理、显示是三个步骤。

自评