Python 文件操作与异常处理完全指南
在编程世界中,文件操作和异常处理是两个非常重要的概念。无论是保存用户数据、读取配置文件,还是处理程序运行中可能出现的错误,都离不开这两项技能。本文将详细介绍 Python 中的文件操作和异常处理机制,帮助读者掌握这些实用的编程技能
一、文件的概念
1.1 什么是文件
文件是计算机中存储数据的基本单位。内存中存放的数据在计算机关机后就会消失,而文件可以将数据长久地保存在硬盘、光盘、U 盘等存储设备中。一篇文章、一段视频、一个可执行程序,都可以被保存为一个文件,并赋予一个文件名。
操作系统以文件为单位管理磁盘中的数据。根据内容和用途,文件可以分为多种类型:
- 文本文件:存储文字信息,如.txt、.docx 文件
- 视频文件:存储视频数据,如.mp4、.avi 文件
- 音频文件:存储音频数据,如.mp3、.wav 文件
- 图像文件:存储图像数据,如.jpg、.png 文件
- 可执行文件:可以直接运行的程序,如.exe、.py 文件
1.2 文件操作包含哪些内容
在日常编程中,我们对文件的主要操作包括:
- 创建文件
- 打开文件
- 读取文件内容
- 写入文件内容
- 关闭文件
- 文件备份
1.3 文件操作的作用
文件操作的主要作用是数据持久化存储。通过文件操作,我们可以:
- 把程序运行过程中产生的数据保存起来
- 让程序下次执行时可以直接使用之前保存的数据
- 实现数据的共享和传输
- 节省重新生成数据的时间和资源
二、文件的基本操作
2.1 文件操作三步走
Python 中进行文件操作遵循一个简单的三步流程:
- 打开文件:使用open()函数打开文件,获取文件对象
- 读写文件:通过文件对象的方法进行读取或写入操作
- 关闭文件:使用close()方法关闭文件,释放资源
2.2 open 函数打开文件
open()函数是 Python 中打开文件的主要方法,其基本语法如下:
f = open(name, mode)
参数说明:
- name:要打开的文件名(可以包含文件路径)
- mode:打开文件的模式(访问模式)
- 返回值:一个文件对象,后续的文件操作都通过这个对象进行
2.3 文件打开模式详解
文件打开模式决定了我们可以对文件进行哪些操作。常用的模式有:
|
模式 |
描述 |
|
r |
只读模式,文件指针在开头 |
|
w |
只写模式,覆盖原有内容 |
|
a |
追加模式,在文件末尾添加内容 |
|
r+ |
读写模式,文件指针在开头 |
|
w+ |
读写模式,覆盖原有内容 |
|
a+ |
读写模式,文件指针在末尾 |
重要说明:
- r 模式:文件必须存在,否则会报错
- w 模式:文件不存在则创建,存在则清空原有内容
- a 模式:文件不存在则创建,存在则在末尾追加内容
2.4 write 函数写入文件
使用文件对象的write()方法可以向文件中写入内容:
f.write('要写入的内容')
注意事项:
- 写入的内容必须是字符串类型
- 中文写入可能会出现乱码问题,需要指定编码方式
2.5 解决中文乱码问题
中文乱码是文件操作中常见的问题,主要原因是编码方式不匹配。解决方法是在打开文件时指定编码方式:
# 使用UTF-8编码打开文件
f = open('test.txt', 'w', encoding='utf-8')
f.write('中文内容')
f.close()
常用的编码方式:
- UTF-8:通用的 Unicode 编码,推荐使用
- GBK:中文编码标准
- ASCII:英文编码标准
2.6 文件读取操作
Python 提供了多种读取文件的方法:
1. read () 方法
# 读取所有内容
content = f.read()
# 读取指定长度的内容
content = f.read(1024) # 读取1024个字符
2. readlines () 方法
# 按行读取所有内容,返回列表
lines = f.readlines()
for line in lines:
print(line)
3. readline () 方法
# 逐行读取内容
while True:
line = f.readline()
if not line:
break
print(line, end='')
2.7 close 函数关闭文件
文件操作完成后,必须关闭文件以释放系统资源:
f.close()
为什么要关闭文件?
- 释放操作系统分配的文件描述符
- 确保所有缓冲的数据都被写入磁盘
- 防止文件被锁定,影响其他程序访问
2.8 简单案例
案例 1:创建并写入文件
# 打开文件(不存在则创建)
f = open('hello.txt', 'w', encoding='utf-8')
# 写入内容
f.write('Hello, Python!\n')
f.write('这是我的第一个文件操作程序\n')
# 关闭文件
f.close()
print('文件创建完成!')
案例 2:读取文件内容
# 打开文件
f = open('hello.txt', 'r', encoding='utf-8')
# 读取内容
content = f.read()
print('文件内容:')
print(content)
# 关闭文件
f.close()
三、文件备份案例
3.1 案例需求
实现一个文件备份功能:
- 用户输入要备份的文件名
- 程序自动创建备份文件
- 备份文件名为原文件名加 "[备份]" 后缀
- 例如:test.txt → test [备份].txt
3.2 实现思路
- 接收用户输入的文件名
- 生成备份文件名
- 读取源文件内容
- 将内容写入备份文件
- 关闭文件
3.3 代码实现
def backup_file():
# 1. 接收用户输入的文件名
old_filename = input('请输入要备份的文件名:')
# 2. 生成备份文件名
# 找到文件名中的点号位置
dot_index = old_filename.rfind('.')
if dot_index > 0:
# 有扩展名的文件
new_filename = old_filename[:dot_index] + '[备份]' + old_filename[dot_index:]
else:
# 没有扩展名的文件
new_filename = old_filename + '[备份]'
try:
# 3. 打开源文件和备份文件
with open(old_filename, 'rb') as old_file:
with open(new_filename, 'wb') as new_file:
# 4. 读取并写入文件内容
while True:
# 每次读取1024字节
content = old_file.read(1024)
if not content:
break
new_file.write(content)
print(f'文件备份成功!备份文件名为:{new_filename}')
except FileNotFoundError:
print(f'错误:文件"{old_filename}"不存在')
except Exception as e:
print(f'备份过程中发生错误:{e}')
# 调用函数
backup_file()
3.4 代码优化要点
- 使用 with 语句:自动管理文件关闭,避免资源泄漏
- 二进制模式操作:适用于所有类型文件,包括图片、音频等
- 异常处理:处理文件不存在等可能出现的错误
- 分块读取:避免一次性读取大文件导致内存不足
四、文件和文件夹操作
4.1 os 模块介绍
在 Python 中,文件和文件夹的操作需要使用os模块。os模块提供了丰富的方法来处理文件和目录
使用步骤:
- 导入 os 模块
- 调用 os 模块中的相关函数
import os
4.2 文件操作方法
|
函数 |
功能 |
示例 |
|
os.rename() |
文件重命名 |
os.rename('old.txt', 'new.txt') |
|
os.remove() |
删除文件 |
os.remove('file.txt') |
|
os.path.exists() |
检查文件是否存在 |
if os.path.exists('file.txt'): |
|
os.path.getsize() |
获取文件大小 |
size = os.path.getsize('file.txt') |
示例代码:
import os
import time
# 文件重命名
os.rename('old_name.txt', 'new_name.txt')
print('文件重命名完成')
# 延时查看效果
time.sleep(5)
# 删除文件
os.remove('new_name.txt')
print('文件删除完成')
4.3 文件夹操作方法
|
函数 |
功能 |
示例 |
|
os.mkdir() |
创建文件夹 |
os.mkdir('test_folder') |
|
os.rmdir() |
删除空文件夹 |
os.rmdir('test_folder') |
|
os.listdir() |
列出文件夹内容 |
files = os.listdir('.') |
|
os.path.isdir() |
检查是否为文件夹 |
if os.path.isdir('folder'): |
示例代码:
import os
# 创建文件夹
os.mkdir('test')
print('文件夹创建完成')
# 列出文件夹内容
print('当前目录内容:')
for item in os.listdir('.'):
print(item)
# 删除文件夹
os.rmdir('test')
print('文件夹删除完成')
4.4 递归删除文件夹
os.rmdir()只能删除空文件夹。要删除非空文件夹,需要使用递归方法:
import os
def delete_folder(folder_path):
# 遍历文件夹中的所有内容
for item in os.listdir(folder_path):
item_path = os.path.join(folder_path, item)
# 如果是文件,直接删除
if os.path.isfile(item_path):
os.remove(item_path)
print(f'删除文件:{item_path}')
# 如果是文件夹,递归删除
elif os.path.isdir(item_path):
delete_folder(item_path)
print(f'删除文件夹:{item_path}')
# 删除空文件夹
os.rmdir(folder_path)
print(f'删除文件夹:{folder_path}')
# 使用示例
# delete_folder('test_folder') # 谨慎使用!
警告: 递归删除操作非常危险,请务必谨慎使用,避免误删重要文件
4.5 文件路径知识
文件路径是指文件在计算机中的存储位置,分为两种类型:
1. 绝对路径
从盘符开始的完整路径,例如:
C:\Users\Documents\file.txt
2. 相对路径
相对于当前程序所在目录的路径:
- 同级路径:直接使用文件名
- 下一级路径:使用文件夹名/文件名
- 上一级路径:使用../文件名
示例:
# 同级路径
f = open('data.txt', 'r')
# 下一级路径
f = open('files/data.txt', 'r')
# 上一级路径
f = open('../data.txt', 'r')
五、Python 异常处理
5.1 什么是异常
异常是程序运行过程中出现的错误。当 Python 解释器遇到无法处理的错误时,会抛出异常并终止程序执行
常见的异常类型:
- FileNotFoundError:文件不存在
- ZeroDivisionError:除数为零
- TypeError:类型错误
- ValueError:数值错误
- IndexError:索引越界
异常示例:
# 文件不存在异常
f = open('nonexistent.txt', 'r')
# 输出:FileNotFoundError: [Errno 2] No such file or directory: 'nonexistent.txt'
# 除数为零异常
print(10 / 0)
# 输出:ZeroDivisionError: division by zero
5.2 异常捕获机制
异常捕获可以让程序在出现错误时不会立即终止,而是执行相应的处理代码。Python 使用try...except语句来捕获异常
基本语法:
try:
# 可能出现异常的代码
risky_code()
except:
# 出现异常时执行的代码
handle_exception()
捕获特定异常:
try:
f = open('file.txt', 'r')
except FileNotFoundError:
print('文件不存在,正在创建新文件...')
f = open('file.txt', 'w')
捕获多个异常:
try:
result = 10 / int(input('请输入除数:'))
print(f'结果:{result}')
except ValueError:
print('输入的不是有效数字!')
except ZeroDivisionError:
print('除数不能为零!')
except Exception as e:
print(f'发生了未知错误:{e}')
5.3 获取异常信息
使用as关键字可以获取异常对象,从而获得更详细的错误信息:
try:
f = open('file.txt', 'r')
except Exception as e:
print(f'错误类型:{type(e).__name__}')
print(f'错误信息:{e}')
print(f'错误参数:{e.args}')
5.4 else 语句
else语句用于指定当没有异常发生时要执行的代码:
try:
f = open('file.txt', 'r')
except FileNotFoundError:
print('文件不存在')
else:
# 只有在没有异常时才执行
content = f.read()
print(f'文件内容:{content}')
f.close()
5.5 finally 语句
finally语句用于指定无论是否发生异常都要执行的代码,通常用于资源清理:
f = None
try:
f = open('file.txt', 'r')
content = f.read()
print(content)
except FileNotFoundError:
print('文件不存在')
finally:
# 无论是否有异常,都确保文件被关闭
if f:
f.close()
print('文件已关闭')
5.6 异常处理最佳实践
- 只捕获必要的异常:不要使用空的except语句捕获所有异常
- 提供具体的错误信息:帮助用户理解和解决问题
- 及时清理资源:使用finally或with语句确保资源被正确释放
- 避免过度使用异常:对于可预见的错误,应该使用条件判断来处理
- 记录异常日志:在生产环境中,应该将异常信息记录到日志文件中
六、总结与进阶建议
回顾:
- 文件操作基础:打开、读写、关闭文件的基本方法
- 文件模式:r、w、a 等模式的区别和使用场景
- 路径处理:绝对路径和相对路径的概念和使用
- os 模块:文件和文件夹的各种操作方法
- 异常处理:try、except、else、finally 语句的使用
- 实际应用:通过综合案例巩固所学知识
进阶学习建议:
学习 with 语句:更优雅的文件管理方式
with open('file.txt', 'r') as f:
content = f.read()
掌握 pathlib 模块:现代的路径处理方式
from pathlib import Path
file = Path('data.txt')
学习 pickle 模块:Python 对象的序列化和反序列化
import pickle
with open('data.pkl', 'wb') as f:
pickle.dump(data, f)
更多推荐

所有评论(0)