第八章:文件操作与异常处理——别让程序动不动就崩溃
1. 数据的“轮回”:内存与硬盘
各位少侠,咱们前七章写的代码,运行的时候数据都在内存(RAM)里。内存有个特点:快,但是健忘。一旦程序运行结束,或者电脑断电,里面的数据就灰飞烟灭了。
如果你想写一个“记账本”程序,今天记的账,明天打开还在吗?如果只存在内存里,那肯定没了。 所以,我们需要文件操作,把数据永久地保存到硬盘(磁盘)里。这就好比你把脑子里的想法写在笔记本上,以后随时能翻看。
在Python里,操作文件的核心函数是 open()。
2. 读写文件的“三板斧”
操作文件通常分三步:打开 -> 操作 -> 关闭。
打开模式
'r':只读模式(Read)。文件不存在会报错。'w':写入模式(Write)。文件不存在会创建;文件存在会清空内容!(慎用!)'a':追加模式(Append)。在文件末尾接着写,不会清空原内容。
基础操作
python
# 1. 写入文件
f = open('diary.txt', 'w', encoding='utf-8') # 记得指定编码,不然中文会乱码
f.write("今天学了Python,感觉很棒!\n")
f.write("但是文件操作有点难记。")
f.close() # 别忘了关门!
# 2. 读取文件
f = open('diary.txt', 'r', encoding='utf-8')
content = f.read() # 一次性读完
print(content)
f.close()
进阶技巧:with 语句(强烈推荐)
新手最容易犯的错就是忘了写 f.close()。如果文件没关闭,可能会导致数据没写进去,或者占用系统资源。
Python提供了一个优雅的写法 with,它会在代码块执行完后,自动帮你把文件关了,哪怕中间报错了也会关。
python
# 使用 with 语句,无需手动 close
with open('diary.txt', 'a', encoding='utf-8') as f:
f.write("\n今天学会了用 with 语句,真香!")
with open('diary.txt', 'r', encoding='utf-8') as f:
for line in f: # 可以像遍历列表一样遍历文件的每一行
print(line.strip()) # strip() 去掉末尾的换行符
3. 异常处理:给程序穿上“防弹衣”
写程序时,最怕遇到红色的报错信息(Traceback),然后程序直接闪退。
比如,你让用户输入一个数字,用户偏偏输入了“abc”,你的程序一计算就会崩溃。
或者,你想读取 data.txt,结果用户把文件删了,程序直接报错退出。
这时候,你需要异常处理。它的逻辑是:“尝试做这件事,如果出错了,别崩溃,按我说的做。”
语法结构是 try...except:
python
try:
num = int(input("请输入一个数字:"))
result = 10 / num
print(f"10除以{num}等于{result}")
except ValueError:
print("哎呀!我要的是数字,不是文字!")
except ZeroDivisionError:
print("数学老师棺材板压不住了!除数不能为0!")
except Exception as e:
print(f"发生了未知的错误:{e}")
else:
print("一切顺利,没有发生异常!")
finally:
print("不管有没有错,这句话都会打印。通常用来做清理工作。")
为什么要用异常处理?
- 提升用户体验:用户看到的是友好的提示,而不是一堆看不懂的代码报错。
- 保证程序健壮性:服务器程序如果因为一个小错误就宕机,那是重大事故。
4. 综合实战:一个简单的日志记录器
结合文件操作和异常处理,我们写一个小工具:记录程序的运行日志。
python
import datetime
def log_message(message):
try:
# 获取当前时间
current_time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
log_content = f"[{current_time}] {message}\n"
# 追加写入日志文件
with open('app.log', 'a', encoding='utf-8') as f:
f.write(log_content)
print("日志记录成功!")
except Exception as e:
print(f"日志记录失败:{e}")
# 测试
log_message("用户登录系统")
log_message("系统运行正常")
5. 本章小结与课后“折磨”
今天你学会了让数据“长生不老”(文件操作),以及给程序穿上“防弹衣”(异常处理)。这是从“写脚本”迈向“开发软件”的重要一步。
课后小挑战:
- 写一个程序,读取一个文本文件,统计里面有多少个单词(按空格分割)。
- 修改上面的程序,加上异常处理:如果文件不存在,提示用户“文件没找到”,而不是直接报错崩溃。
- 写一个简单的“通讯录”程序:启动时读取
contacts.txt,用户可以输入名字和电话,程序将其保存到文件中,下次启动还能看到。
敲完代码,恭喜你,你的程序已经具备了基本的“生存能力”!下一节,我们将探索Python最迷人的地方——第三方库生态,看看别人造好的轮子有多香!
本文由 AI 辅助生成
参考资料:
- Python官方文件读写教程:https://docs.python.org/zh-cn/3/tutorial/inputoutput.html#reading-and-writing-files
- Python官方异常处理文档:https://docs.python.org/zh-cn/3/tutorial/errors.html
- 菜鸟教程Python文件I/O:https://www.runoob.com/python3/python3-file-io.html