国庆节10月1日
--


文件读写三步法(打开/读写/关闭)、r/w/a 三种模式、相对路径与绝对路径,以及资源释放的最佳实践

日常我们操作文件时,基本分为三步操作:打开、读/写、关闭。
1# 1. 打开文件2f = open("resources/望庐山瀑布.txt", "r", encoding="utf-8")3
4# 2. 读取文件5content = f.read()6print(content)7
8# 3. 关闭文件9f.close()1# 1. 打开文件2f = open("resources/静夜思.txt", "w", encoding="utf-8")3
4# 2. 写入文件5f.write("窗前明月光,\n")6f.write("疑是地上霜。\n")7f.write("举头望明月,\n")8f.write("低头思故乡。\n")9
10# 3. 关闭文件11f.close()如果操作完文件并未调用 close 方法关闭文件,同时程序没有停止运行,那么这个文件将一直被 Python 程序占用,无法操作(比如在资源管理器里删除或改名会失败;写入的内容也可能还没真正落盘)。
编码:是将字符(文字、数字、符号)转换为计算机能够存储和处理的数字代码的规则系统,如:ASCII、GBK、UTF-8。
写中文文本时必须指定 encoding="utf-8",否则在 Windows 上会按系统默认编码(GBK)读写,容易出现乱码或 UnicodeDecodeError。
| 写法 | 含义 | 示例 |
|---|---|---|
| 相对路径 | 相对于当前工作目录的路径 | resources/静夜思.txt |
| 绝对路径 | 从文件系统的目录开始,完整地描述文件位置的路径 | D:/python/第3章/resources/静夜思.txt |
在项目开发中,推荐使用相对路径写法:可移植性更好、路径简洁、易于阅读。(换台电脑、换个目录,绝对路径就失效了)
| 模式 | 含义 |
|---|---|
r | 只读的方式打开文件,指针放在文件的开头(默认模式) |
w | 只写入模式,从头编辑,原有内容会被删除;文件不存在则创建新文件 |
a | 追加模式,新内容会被追加在原有内容之后;文件不存在则创建新文件 |
w 模式最危险的地方是打开的一瞬间原内容就没了,即使后面一个字都没写。只想在末尾加内容就用 a。
补充(本章未涉及但常用的模式):r+ 读写、w+ 清空后读写、a+ 追加读写;加 b 表示二进制模式(如 rb、wb 用于图片、音频)。
| 方法 | 作用 |
|---|---|
f.read() | 读取所有内容,返回一个字符串 |
f.readlines() | 按行读取全部内容,返回一个列表(每行末尾带 \n) |
f.write("...") | 写入字符串(不会自动换行,需要手动写 \n) |
1f = open("resources/望庐山瀑布.txt", "r", encoding="utf-8")2content_list = f.readlines()3for line in content_list:4 print(line.strip()) # strip() 去掉每行末尾的换行符5f.close()问题:如果操作文件过程中出现了异常,程序就跳过了 close,文件无法关闭了,怎么解决?
1# 1. 打开文件2f = open("resources/静夜思.txt", "w", encoding="utf-8")3try:4 # 2. 写入文件内容5 f.write("静夜思(李白)\n")6 f.write("窗前明月光,\n")7 i = 1 / 0 # 这里抛异常8 f.write("疑是地上霜。\n")9finally:10 print("关闭文件")11 # 3. 关闭文件12 f.close()不管 try 里面是否出错,finally 里的代码都会执行,所以文件一定会被关闭。
1# 写文件2with open("resources/静夜思.txt", "w", encoding="utf-8") as f:3 f.write("静夜思(李白)\n\n")4 f.write("窗前明月光,\n")5 f.write("疑是地上霜。\n")6 f.write("举头望明月,\n")7 f.write("低头思故乡。\n")| 对比 | try…finally | with open |
|---|---|---|
| 代码量 | 需要手动写 try/finally 和 close | 不用写 close |
| 可读性 | 繁琐 | 简洁 |
| 是否自动释放 | 手动释放 | 即使发生异常,也会被正确释放 |
with 语句(上下文管理器)的核心作用就是确保资源总是被正确获取和释放,也是项目开发中的推荐方式。本章项目里的文件读写全部用的是 with open(...)。
| 题目 | 答案 |
|---|---|
| 文件的操作(读/写)分为哪几步 | 打开:open() 函数;读/写:read()、write() 方法;关闭:close() 方法 |
| 文件资源释放的最佳实践 | try...finally 或 with open()(推荐,最佳实践) |
open("resources/静夜思.txt", "r", encoding="utf-8")f.read();按行读取返回列表:f.readlines()f.write("窗前明月光,\n")(不会自动换行,要自己写 \n)r 只读、w 从头编辑会清空(删除)原有内容、a 是追加模式with open(...) as f(即使异常也会正确释放)finally 作用是:不管是否出异常,代码都会执行 2-1 写文件
把《静夜思》四句诗写进 poem.txt(每句一行,标题单独一行),写完关闭文件。
一级 · 思路:打开 → 写 → 关闭;每行末尾要自己加换行符
二级 · 方法:open(..., "w", encoding="utf-8") / f.write(...) / f.close()
三级 · 骨架:f.write("疑是地上霜。\____")
1# 1. 打开文件2f = open("poem.txt", "w", encoding="utf-8")3
4# 2. 写入内容(每行末尾要自己写 \n)5f.write("静夜思(李白)\n")6f.write("窗前明月光,\n")7f.write("疑是地上霜。\n")8f.write("举头望明月,\n")9f.write("低头思故乡。\n")10
11# 3. 关闭文件12f.close() 2-2 读文件
把上一步写出的 poem.txt 读出来,逐行打印(每行末尾不要多出空行)。
一级 · 思路:按行读会得到带换行符的列表,打印前先把换行符去掉
二级 · 方法:f.readlines() + line.strip()
三级 · 骨架:for line in f.readlines(): print(line.____())
1f = open("poem.txt", "r", encoding="utf-8")2
3content_list = f.readlines()4for line in content_list:5 print(line.strip()) # strip() 去掉每行末尾的换行符6
7print(f"共 {len(content_list)} 行")8
9f.close() 2-3 with 与三种模式
用 with open(...) 重写写文件;然后对比 w 和 a:先用 w 写一次,再用 a 追加一次,观察原内容有没有被保留。
一级 · 思路:w 打开的一瞬间原内容就没了,a 是在末尾接着写
二级 · 方法:with open(..., "a", encoding="utf-8") as f:
三级 · 骨架:跑两次程序,观察文件内容的变化
1# with open:不用手动 close,出异常也会正确释放2with open("poem.txt", "w", encoding="utf-8") as f:3 f.write("第一行\n")4 f.write("第二行\n")5
6# a 模式:追加,原内容保留7with open("poem.txt", "a", encoding="utf-8") as f:8 f.write("第三行(追加的)\n")9
10with open("poem.txt", "r", encoding="utf-8") as f:11 print(f.read())12
13# 如果第二步也用 "w",原内容会被清空,最后只剩"第三行"14# 再试 "r" 模式写入会报错:io.UnsupportedOperation: not writable如果你喜欢,那么欢迎来到我的世界!
了解更多暂未播放



"生活不是等待暴风雨过去,而是学会在雨中跳舞。"—— 塞维涅夫人


