第 8 课 / 共 9 课16 分钟2 个闯关

文件与异常:让数据留下来

with open、JSON、看懂报错信息、try/except。

让数据活过程序的一生

程序一关,内存里的变量全没了。要让数据留下来,得写进文件。

with open("note.txt", "w", encoding="utf-8") as f:
    f.write("第一行\n")
    f.write("第二行\n")
  • open(文件名, 模式, encoding) —— 打开文件
  • "w" —— 写入模式,注意:会清空原有内容。追加用 "a",只读用 "r"
  • encoding="utf-8" —— 中文必须写,否则在 Windows 上大概率乱码或报错
  • \n —— 换行符。不写的话所有内容会挤在一行
  • with ... as f —— 用完自动关文件,哪怕中间报错也会关。永远用 with,别手写 open/close

读出来

with open("note.txt", "r", encoding="utf-8") as f:
    content = f.read()        # 一次读成一个大字符串
print(content)

with open("note.txt", "r", encoding="utf-8") as f:
    for line in f:            # 逐行读,文件很大时更省内存
        print(line.strip())   # strip() 去掉行尾的换行符

错误不是敌人,是信息

程序报错时,先从下往上看。最后一行告诉你错误类型和原因,倒数第二行告诉你出错的文件和行号。这两行信息量占了 90%。

几个高频错误类型,看到就知道往哪查:

错误意思常见原因
SyntaxError语法写错了少冒号、括号没配对、中文标点
NameError用了不存在的名字拼写错误、变量还没赋值
TypeError类型不对字符串和数字相加
ValueError类型对但值不行int("abc")
IndexError下标越界列表只有 3 个却取第 4 个
KeyError字典里没这个键拼错键名
FileNotFoundError文件不存在路径错了

中文标点是新手最常见的 SyntaxError 来源:全角括号 ()、全角引号 ""、全角冒号 都会报错。代码里除了字符串内部,一律用英文标点。

主动接住错误

有些错误不是你的 bug,是用户的输入不靠谱。这种要接住而不是让程序崩掉:

try:
    age = int(input("年龄:"))
    print(f"明年 {age + 1} 岁")
except ValueError:
    print("请输入数字,别输入文字")

try 里的代码正常跑;一旦抛出 ValueError,立刻跳到 except 那段,程序继续活着。

完整形态:

try:
    f = open("data.txt", "r", encoding="utf-8")
except FileNotFoundError:
    print("文件不存在,我给你建一个")
else:
    print("读取成功")      # 没出错才执行
finally:
    print("收尾工作")      # 不管出没出错都执行

不要写光秃秃的 except:(接住所有错误却什么都不说)。那会把真正的 bug 一起吞掉,让你调试时完全摸不着头脑。要接就接具体的类型。

存结构化数据用 JSON

文本文件只能存字符串。要存列表和字典,用 JSON:

import json

data = {"name": "小明", "scores": [88, 92]}

with open("data.json", "w", encoding="utf-8") as f:
    json.dump(data, f, ensure_ascii=False, indent=2)

with open("data.json", "r", encoding="utf-8") as f:
    loaded = json.load(f)
print(loaded["name"])   # 小明

ensure_ascii=False 让中文以原样存进去而不是 小明indent=2 让文件有缩进、人能读。

10 秒自测

"w" 模式打开一个已有内容的文件,原内容还在吗?

答案是不在了,会被清空。想保留并追加,用 "a"。这个坑每个人都踩过一次,希望你是看文档踩的。

广告位(未配置 AdSense,上线后在此展示)

动手闯关

读懂了不算会,写出来才算

0/2 已通过

闯关和判题完全免费,交错了不扣任何东西。卡住随时点「问 AI」,它能看到你正在写的代码。

关卡 01选择+10 点 · +15 XP

报错类型对号入座

`int("abc")` 会抛出哪种错误?

  • 可能是多选,选错不扣点数,随便试。
登录后闯关拿点数
关卡 02填空+10 点 · +15 XP

接住这个错误

补全这段代码,让用户输入非数字时不崩溃: ```python ____: age = int(input()) ____ ValueError: print("请输入数字") ```

登录后闯关拿点数

学完了?标记一下

标记完成会记进度、涨 20 XP,还会点亮连续学习天数。