Python文件操作与异常处理
这篇整理文件读写和异常处理两个知识点。文件操作在实际项目中几乎天天用,异常处理则是让程序更健壮的关键。
十九、文件操作
一、文件操作的基本流程
文件操作就三步:打开 -> 读写 -> 关闭
# 1. 打开文件
f = open("文件名", "访问模式", encoding="编码")
# 2. 读取或者写入内容
content = f.read()
# 3. 关闭文件
f.close()
更好的写法是用 with 语句,自动关闭文件:
with open("文件名", "r", encoding="utf-8") as f:
content = f.read()
print(content)
# 出了with块,文件自动关闭
二、打开文件 open()
文件对象 = open("文件名", "访问模式", encoding="编码")
文件路径
- 绝对路径:从根目录开始,完整唯一的路径,在哪运行代码都不会出错
- 相对路径:以当前代码所在目录为起点,只写相对路径
- . 当前目录
- .. 上一级目录
- ../.. 上两级目录
访问模式
| “r” | 只读(默认) | 报错 | 从开头读 | 文件开头 |
| “w” | 只写 | 创建新文件 | 清空原内容 | 文件开头 |
| “a” | 追加写 | 创建新文件 | 保留原内容 | 文件末尾 |
| “r+” | 读写 | 报错 | 从开头读写 | 文件开头 |
| “w+” | 读写 | 创建新文件 | 清空原内容 | 文件开头 |
| “a+” | 读写追加 | 创建新文件 | 保留原内容 | 文件末尾 |
以上模式默认以文本方式处理文件。
后面加 b 表示二进制模式,如 "rb"、"wb",适用于图片、视频、音频等。二进制模式不需要 encoding 参数。
三、读取文件内容
1. read() —— 读取整个文件
with open("test.txt", "r", encoding="utf-8") as f:
content = f.read()
print(content)
2. read(n) —— 读取n个字符
with open("test.txt", "r", encoding="utf-8") as f:
content = f.read(10) # 读取前10个字符
print(content)
3. readline() —— 读取一行
with open("test.txt", "r", encoding="utf-8") as f:
line = f.readline() # 读取第一行
print(line)
4. readlines() —— 读取所有行,返回列表
with open("test.txt", "r", encoding="utf-8") as f:
lines = f.readlines()
print(lines) # ["第一行\\n", "第二行\\n", …]
5. 直接遍历文件对象(推荐)
with open("test.txt", "r", encoding="utf-8") as f:
for line in f:
print(line, end="")
四、写入文件内容
1. write() —— 写入字符串
with open("test.txt", "w", encoding="utf-8") as f:
f.write("hello world!\\n")
f.write("这是第二行\\n")
2. writelines() —— 写入字符串列表
注意:writelines() 不会自动添加换行符,需要手动在每个字符串末尾加 \\n。
lines = ["第一行\\n", "第二行\\n", "第三行\\n"]
with open("test.txt", "w", encoding="utf-8") as f:
f.writelines(lines)
3. 追加写入
with open("test.txt", "a", encoding="utf-8") as f:
f.write("追加的内容\\n")
二十、异常
一、什么是异常?
异常(Exception)是程序在运行过程中发生的错误,它会中断程序的正常执行流程。
比如除零错误、文件不存在、索引越界等等。
二、为什么要处理异常?
- 不处理异常:程序直接崩溃,用户体验差
- 处理异常:让程序能够"容错",在出现错误时走备选方案或给出友好提示,不会意外崩溃
三、基本的异常处理语法
1. try-except:捕获常规异常
try:
# 可能出错的代码
result = 10 / 0
except:
# 如果出错,执行这里的代码
print("出现了异常!")
2. 捕获指定类型的异常
try:
number = int(input("请输入数字:"))
result = 100 / number
print(f"结果是:{result}")
except ZeroDivisionError:
print("不能输入0!")
except ValueError:
print("必须输入数字!")
3. 捕获异常对象
try:
my_list = [1, 2, 3]
print(my_list[10])
except IndexError as e:
print(f"越界错误:{e}")
4. 一个except捕获多种异常
try:
# 可能出错的代码
pass
except (ValueError, TypeError, ZeroDivisionError) as e:
print(f"出错了:{e}")
5. 捕获所有异常
try:
print(num)
except Exception as e:
print(f"发生错误:{e}")
6. else —— 没有异常时执行
try:
result = 10 / 2
except Exception as e:
print(e)
else:
print("没有异常,结果是:", result)
7. finally —— 无论是否异常都执行
try:
f = open("test.txt", "r")
except Exception as e:
f = open("test.txt", "w")
else:
print("没有异常,真开心")
finally:
f.close() # 不管有没有异常,文件都会被关闭
实际场景:读取配置文件,如果文件不存在就创建默认配置
import json
def load_config():
try:
with open("config.json", "r", encoding="utf-8") as f:
return json.load(f)
except FileNotFoundError:
print("配置文件不存在,创建默认配置")
return {"theme": "light", "lang": "zh"}
except json.JSONDecodeError:
print("配置文件格式错误")
return {"theme": "light", "lang": "zh"}
config = load_config()
print(config)
文件操作和异常处理就先到这,下一篇讲模块、JSON和面向对象。
网硕互联帮助中心




评论前必须登录!
注册