跳到主要内容

文件、输入输出与异常处理

这篇想把三个经常一起出现的主题放在一页里:

  • 怎么读输入、写输出
  • 怎么安全地处理文件
  • 出错时怎么让程序更稳一些

标准输入输出

最基础的输入是 input()

name = input("name: ")
age = int(input("age: "))
print(name, age)

如果是一行多个值,通常配合 split()map()

x, y = map(int, input().split())

更完整的读入模式可以直接看这篇速查:

文件读写

读取文本文件

最推荐的写法是 with open(...),这样文件会自动关闭:

with open("notes.txt", "r", encoding="utf-8") as f:
content = f.read()

按行读取

with open("notes.txt", "r", encoding="utf-8") as f:
for line in f:
print(line.rstrip())

写入文件

lines = ["alpha", "beta", "gamma"]

with open("out.txt", "w", encoding="utf-8") as f:
f.write("\n".join(lines))

常见模式:

  • "r":读
  • "w":写,会覆盖原内容
  • "a":追加
  • "rb" / "wb":二进制模式

JSON 的基本处理

如果是结构化数据,优先考虑 json 模块:

import json

data = {"name": "alice", "score": 95}

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)

异常处理

为什么要处理异常

很多错误并不是“代码写错了”,而是运行环境不满足预期:

  • 文件不存在
  • 用户输入不是数字
  • 字典里没有这个键
  • 网络请求失败

这时不要假装程序永远不会错,而是明确处理你预期中的异常。

try / except / else / finally

try:
value = int(input("number: "))
except ValueError:
print("请输入整数")
else:
print("读取成功", value)
finally:
print("这一段总会执行")

只捕获你真的想处理的异常

不推荐一上来就写:

try:
...
except Exception:
...

这会把很多本来应该暴露出来的问题也吞掉。更稳妥的做法是优先写具体异常类型,例如:

try:
with open("missing.txt", "r", encoding="utf-8") as f:
print(f.read())
except FileNotFoundError:
print("文件不存在")

raise:主动抛出异常

当输入不满足你的约束时,可以主动报错:

def divide(a, b):
if b == 0:
raise ValueError("b 不能为 0")
return a / b

我更推荐的习惯

  • 文件操作统一写成 with open(..., encoding="utf-8")
  • 把“正常逻辑”和“异常处理”分开写,不要混成一团
  • 捕获尽量具体,不要无脑 except Exception
  • 需要失败就明确失败,不要为了“看起来没报错”而吞异常

关联阅读