第10节:文件操作与异常处理 – 让程序更”抗揍”的艺术
从菜鸟到大神的必经之路
恭喜你!
现在你已经掌握了Python编程的基本功,就像学会了骑自行车一样简单。
但要想成为真正的编程高手,我们得给你的程序装上”防撞气囊”和”记忆芯片”。
本节将带你探索:
– 📁 文件操作:让你的程序变身”数据饕餮”,轻松吞下海量数据
– 🚨 异常处理:程序界的”防弹衣”,面对各种意外都能优雅应对
– 🧩 JSON魔法:让数据在程序关闭后还能”死而复生”
想象一下,你的程序不仅能记住用户上次的操作,还能在遇到错误时优雅地”打个嗝”继续工作,而不是直接”口吐白沫”崩溃掉。
这就是本节要教你的超能力!
10.1 文件读取 – 程序界的”开卷考试”
文本文件能存储从《战争与和平》到你家猫咪的体重记录等各种信息。

学会读取文件,你的程序就能从”单机游戏”升级为”网络游戏”。
10.1.1 一口吞下整个文件
让我们从一个美味的π开始(别担心,这个π不会让你发胖)。
创建一个名为pi_digits.txt的文件,内容如下:
3.1415926535
8979323846
2643383279
现在,让我们用Python的”大嘴怪”模式一口吃掉整个文件:
from pathlib import Path
path = Path('pi_digits.txt') # 给文件发个"定位器"
contents = path.read_text() # 啊呜一口全吃掉
print(contents) # 吐出来看看
运行这段代码,你会发现输出比原文件多了一个空行,就像吃完饭后打了个饱嗝。
这是因为read_text()方法在文件末尾偷偷加了个”饱嗝符”。
要去掉这个”饱嗝符”,我们可以用rstrip()方法给程序”拍拍背”:
contents = path.read_text().rstrip() # 连招:读取+拍背
这种连续调用方法的技巧叫做”方法链”,就像吃薯条时连续蘸番茄酱一样自然流畅。

小贴士:文件路径的”寻宝游戏”
– 如果文件不在当前目录,你需要提供完整路径,就像给快递员详细地址一样
– VS Code用户注意:编辑器只在最近打开的文件夹中”寻宝”,记得先打开正确的文件夹
– Windows用户:路径要用反斜杠或原始字符串,比如`Path(r'C: emppi.txt')`
现在你的程序已经学会”吃东西”了,接下来我们会教它更优雅的”用餐礼仪”(逐行读取)和”食物中毒”时的应急处理(异常捕获)。敬请期待!

10.1.2 文件路径的两种打开方式:相对与绝对
想象一下你是个路痴程序员(别担心,我们都有这种时候),现在要告诉Python去哪里找文件。
这时候你有两个选择:
相对路径和绝对路径,就像用”我家隔壁的便利店”和”北京市朝阳区某某路某某号”两种方式指路一样。
相对路径:程序员的快捷方式
相对路径就像说”去我文档里的下载文件夹”——它总是从当前程序所在的位置开始算起。
比如你的程序住在D:/code/python_work,而你要找的文件在它的text_files子文件夹里,你可以这样写:
from pathlib import Path
path = Path('text_files/secret_recipe.txt') # 就像说"去我隔壁房间拿"
但要注意!
如果你把程序搬家了,这个相对关系就会乱套——就像把”我家隔壁”这个参照物搬走了一样。

绝对路径:精确到毫米的导航
绝对路径就像GPS坐标,从系统根目录开始一路指到文件家门口:
path = Path('/Users/yourname/code/python_work/text_files/secret_recipe.txt')
这种写法虽然啰嗦,但永远准确,适合那些”我不管程序在哪,我就要这个文件!”的场合。
10.1.3 文件内容的”拆快递”艺术
拿到文件后,我们经常要像拆快递一样逐行检查内容。
Python给了我们一个超好用的拆箱工具——splitlines()方法:
from pathlib import Path
# 第一步:签收快递(读取文件)
file_content = Path('shopping_list.txt').read_text()
# 第二步:拆包装(按行分割)
items = file_content.splitlines() # 现在每行都变成列表中的一个元素
# 第三步:逐件检查
for item in items:
if "特价" in item: # 发现特价商品!
print(f"捡到宝啦:{item}")
else:
print(f"普通商品:{item}")
输出可能长这样:
普通商品:1. 有机苹果 ¥15
捡到宝啦:2. 特价牛排 ¥39(原价¥88)
普通商品:3. 进口牛奶 ¥12
小贴士:
– 斜杠(/)在代码里永远是对的,Pathlib会自动处理成Windows能懂的反斜杠()
– 处理大文件时,逐行读取更省内存(不过这是另一个故事了)
– 记得检查文件是否存在,否则会收获一个FileNotFoundError”惊喜”
现在你不仅知道怎么找文件,还学会了怎么”拆箱”检查内容了!

下次遇到文件操作,就像拆快递一样愉快地开始吧~
10.1.4 玩转文件内容:当代码遇上圆周率
各位代码魔法师们,今天我们要来场文件内容的”变形记”!
想象一下,你手里握着的不是普通的文本文件,而是一串神秘的数字密码——没错,就是那个让无数数学家着迷的圆周率π!
文件读取的魔法时刻
首先,让我们召唤Python的Pathlib神器,把π的数字从文件里”变”出来:
from pathlib import Path
# 施法开始!
pi_file = Path('pi_digits.txt') # 找到藏宝图
pi_content = pi_file.read_text() # 打开宝箱
lines = pi_content.splitlines() # 把宝物分类放好
字符串拼接大法
现在,我们要把这些分散的数字碎片拼成完整的π项链:
pi_necklace = '' # 准备空项链
# 开始串珠子啦!
for bead in lines:
pi_necklace += bead # 一颗一颗串起来
print("原始π项链:", pi_necklace)
print("项链长度:", len(pi_necklace))
运行后会看到:
3.1415926535 8979323846 2643383279
36
等等!
36颗珠子?
怎么比实际数字多?

啊哈,原来每行前面偷偷藏着空格小精灵!
空格大扫除
让我们召唤`.lstrip()`清洁工来个大扫除:
pi_necklace = '' # 换条新项链
for bead in lines:
pi_necklace += bead.lstrip() # 先打扫再串珠
print("精修版π项链:", pi_necklace)
print("真实长度:", len(pi_necklace))
现在终于得到纯净版π:
3.14159265358979323846264338279
32
数据类型小贴士
⚠️ 重要警报!
Python读取文件时会把所有内容都当作字符串处理。
想玩数学游戏?
记得先”变形”:
– 整数变形术:`int()`
– 浮点数变形术:`float()`
脑洞大开时间
学会了这招,你还能:
![图片[1] - python编程-第十节-文件操作与异常处理-001 - 宋马](https://pic.songma.com/blogimg/20250501/75ac953f1941467e8e153204d1ae8f9c.png)
1. 把莎士比亚全集变成一句话(虽然会很长…)
2. 拼接所有程序员的咖啡订单(”美式拿铁摩卡…”)
3. 把你的购物清单变成神秘代码
记住,文件操作就像玩积木,拼接只是开始,后面还有更多有趣的玩法等着你去发现!
现在,快去用代码创造你的字符串艺术品吧!
10.1.5 百万位圆周率的奇妙冒险
谁说数字不能玩出花样?
让我们来挑战一个包含100万位圆周率的超大文件!
虽然前面我们都在玩转三行小文件,但Python可不会因为文件变大就认怂。
想象一下,你手里有个装着百万位圆周率的文本文件(别担心,这文件不会真的有一百万页那么厚)。
Python处理这种大文件就像吃饼干一样轻松:
from pathlib import Path
# 打开我们的"数字宝箱"
pi_file = Path('pi_million_digits.txt')
# 读取所有数字
pi_content = pi_file.read_text()
# 整理成漂亮的一行
clean_pi = ''.join(line.strip() for line in pi_content.splitlines())
# 展示前50位,毕竟谁想看一百万位数字刷屏呢?
print(f"圆周率前50位:{clean_pi[:52]}...")
print(f"总位数(包括小数点):{len(clean_pi)}")
运行结果会告诉你:
3.14159265358979323846264338327950288419716939937510...
1000002
Python的内存处理能力简直就像个无底洞——只要你的电脑内存够大,它就能吞下更多数据!
不过友情提示:
要玩这个游戏,记得先下载配套的百万位圆周率文件哦。
10.1.6 你的生日藏在π里吗?
现在来玩个更有趣的游戏:
你的生日可能在圆周率的前100万位里藏着呢!
这就像在数字海洋中寻宝一样刺激。
# 接着上面的代码
birthday = input("输入你的生日吧(格式:月日年,如120372):")
if birthday in clean_pi:
print("哇!你的生日出现在圆周率里啦!")
else:
print("很遗憾,你的生日没在前100万位圆周率中出现...")
运行示例:
输入你的生日吧(格式:月日年,如120372):120372
哇!你的生日出现在圆周率里啦!
(偷偷告诉你,我的生日也在里面!)
这个程序证明了一点:
只要数据在手,Python就能帮你找出各种有趣的模式。
下次聚会时,这绝对是个炫技的好话题!
Python学习者的欢乐编程三部曲 🐍✨
练习 10.1:Python技能大放送
嘿,Python新手们!
让我们来玩个有趣的游戏——创建你的Python技能清单!
打开你最喜欢的代码编辑器(VSCode、PyCharm或者记事本都行,我们不挑食),新建一个名为”learning_python.txt”的文件。
现在,发挥你的创意,用”In Python you can…”开头写几行你学到的酷炫Python技能。
比如:
In Python you can make computers do your homework (almost)
In Python you can print("Hello World") and feel like a hacker
In Python you can create lists that put your grocery list to shame
保存好后,让我们写个小程序来炫耀你的成果!
第一次,我们直接读取整个文件内容;
第二次,我们把每行存到列表里再逐行展示。
双倍快乐!
练习 10.2:语言变形记
Python太简单?
想试试C语言的硬核魅力?
让我们玩个文字魔术!

用Python的replace()方法,我们可以把你的学习笔记瞬间变成C语言教程(假装是)。
就像变魔术一样:
magic = "I love Python's simplicity"
print(magic.replace('Python', 'C')) # 见证奇迹!
现在,读取你刚才创建的”learning_python.txt”,把所有的”Python”都替换成”C”(或者其他你正在学的语言)。
看着你的学习笔记瞬间变身,是不是很有成就感?
练习 10.3:代码瘦身计划
程序员最爱的两件事:
写代码和…删代码!
让我们给你的程序来个”极简主义”改造。
原本你可能这样写:
contents = file.read()
lines = contents.splitlines() # 这个临时变量有点多余
for line in lines:
print(line)
现在,直接砍掉中间商赚差价:
for line in file.read().splitlines(): # 一行搞定!
print(line)
记住:
最好的代码不是写得最多的,而是写得最聪明的!
(当然,不能聪明到6个月后自己也看不懂)
现在,去享受你的编程之旅吧!
记住,每个Python大师都是从”Hello World”开始的,而你,已经在这条路上飞奔啦! 🚀


















暂无评论内容