让数据活过程序的一生
程序一关,内存里的变量全没了。要让数据留下来,得写进文件。
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"。这个坑每个人都踩过一次,希望你是看文档踩的。