Python文件操作与异常处理详解 :基础方法、注意事项及os模块常用功能
在Python开发中,文件操作是非常基础且重要的技能。无论是读写数据、处理日志,还是管理文件系统,掌握文件操作和异常处理机制都能让你的代码更加健壮和高效。本文将系统介绍Python的文件操作基本方法,结合异常处理机制,并介绍常用的os
模块功能,助你写出高质量的文件处理代码。
目录
一、Python文件操作基础
1.1 打开文件
1.2 读写文件
二、文件操作注意事项
三、Python异常处理机制
四、常用OS模块功能介绍
五、总结
一、Python文件操作基础
Python使用内置函数open()
打开文件,常见用法:
f = open('filename.txt', mode='r', encoding='utf-8')
1.1 打开文件
mode
参数指定文件打开模式:
'r' | 只读(默认) |
'w' | 写入(会覆盖原文件) |
'a' | 追加写入(在文本末尾追加,不会覆盖原文件) |
'b' | 二进制模式 |
'+' | 读写模式 |
基础用法:
(1)'r':只读模式(默认)。文件必须存在,否则报错。
(2)'w':写入模式。如果文件存在,会清空原内容;文件不存在则新建。
(3)'a':追加模式。写入时从文件末尾追加内容,文件不存在则新建。
拼接用法
1. b
(二进制模式)
(1)'rb':以二进制只读方式打开文件。常用于读取图片、视频、音频等非文本文件。
(2)'wb':以二进制写入方式打开文件。会覆盖原文件内容。
(3)'ab':以二进制追加方式打开文件。在文件末尾写入二进制数据。
2. +
(读写模式)
(1)'r+':读写模式。文件必须存在,允许读取和写入。写入不会清空文件,但会从文件开头覆盖。
(2)'w+':读写模式。如果文件存在,会清空原内容再写;如果不存在则新建。
(3)'a+':读写模式。允许在文件末尾追加内容,也可以读取。文件不存在则新建。
3. b
与 +
结合
(1)'rb+':以二进制方式读写文件,文件必须存在。既能读也能写。
(2)'wb+':以二进制方式读写文件,如果文件存在会清空原内容。
(3)'ab+':以二进制方式读写文件,在文件末尾追加写入,同时允许读取。
1.2 读写文件
1)读文件操作:read()、readline()、readlines()
content = f.read() # 读取全部内容
line = f.readline() # 读取一行
lines = f.readlines() # 读取所有行,返回列表
2)写入文件内容
f.write('Hello, world!\n')
f.writelines(['line1\n', 'line2\n'])
3)关闭文件:操作完成后,务必关闭文件释放资源
f.close()
4)推荐的with
语句:使用with
语句自动管理文件关闭,避免忘记关闭导致资源泄露
with open('filename.txt', 'r', encoding='utf-8') as f:content = f.read()
# 无需显式调用close,自动关闭
二、文件操作注意事项
1) 编码问题:读写文本文件时,推荐显式指定encoding='utf-8'
,避免编码错误。
2) 文件路径:使用绝对路径或相对路径时要注意当前工作目录,避免找不到文件。
3) 文件不存在:读取不存在的文件会抛出FileNotFoundError
异常。
4) 写入模式谨慎:'w'
模式会清空原文件,使用前确认需求
5) 二进制文件处理:图片、音频等文件需用'rb'
或'wb'
模式处理。
三、Python异常处理机制
文件操作常伴随异常,如文件不存在、权限不足等。Python的异常处理结构如下:
try:# 可能抛出异常的代码with open('file.txt', 'r') as f:data = f.read()
except FileNotFoundError:print("文件未找到,请检查路径")
except PermissionError:print("权限不足,无法访问文件")
except Exception as e:print(f"发生其他异常: {e}")
else:print("文件读取成功")
finally:print("无论是否异常都会执行")
1)try块中写可能出错的代码
2)except捕获并处理特定异常
3)else在无异常时执行
4)finally无论是否异常都会执行,常用于资源释放
四、常用OS模块功能介绍
os
模块提供丰富的文件和目录操作接口,常用功能包括:
功能 | 方法示例 | 说明 |
---|---|---|
获取当前工作目录 | os.getcwd() | 返回当前脚本运行的目录路径 |
改变工作目录 | os.chdir(path) | 切换当前工作目录 |
创建目录 | os.mkdir(path) | 创建单层目录 |
递归创建目录 | os.makedirs(path) | 创建多层目录 |
删除文件 | os.remove(path) | 删除指定文件 |
删除空目录 | os.rmdir(path) | 删除空目录 |
遍历目录 | os.listdir(path) | 返回目录下所有文件和目录列表 |
高效遍历目录 | os.scandir(path) | 返回目录迭代器,包含文件类型信息 |
判断路径类型 | os.path.isfile(path) | 判断是否为文件 |
断路径是否为目录 | os.path.isdir(path) | 判断是否为目录 |
拼接路径 | os.path.join(path, *paths) | 拼接路径,自动添加分隔符 |
获取绝对路径 | os.path.abspath(path) | 返回路径的绝对路径 |
1. 获取当前工作目录 — os.getcwd()
功能说明:
- 返回当前Python脚本运行时的工作目录路径,类型为字符串。
示例:
import oscwd = os.getcwd()
print(f"当前工作目录是: {cwd}")
2. 改变工作目录 — os.chdir(path)
功能说明:
- 将当前工作目录切换到指定路径
path
。 - 后续相对路径操作都基于新目录。
示例:
import osos.chdir('/tmp')
print(f"切换后的工作目录: {os.getcwd()}")
3. 创建单层目录 — os.mkdir(path)
功能说明:
- 在指定位置创建一个新目录。
- 如果上级目录不存在,会抛出异常。
示例:
import osos.mkdir('new_folder')
print("目录创建成功")
4. 递归创建多层目录 — os.makedirs(path)
功能说明:
- 递归创建多层目录,如果中间目录不存在,会自动创建。
import osos.makedirs('parent_dir/child_dir/grandchild_dir')
print("多层目录创建成功")
5. 删除文件 — os.remove(path)
功能说明:
- 删除指定路径的文件。
- 如果路径不存在或是目录,会抛出异常。
示例:
import osos.remove('file.txt')
print("文件删除成功")
6. 删除空目录 — os.rmdir(path)
功能说明:
- 删除指定的空目录。
- 如果目录非空或不存在,会抛出异常。
示例:
import osos.rmdir('empty_folder')
print("空目录删除成功")
7. 遍历目录内容 — os.listdir(path)
功能说明:
- 返回指定目录下所有文件和目录的名称列表(字符串列表)。
- 不包含子目录的内容,只列出当前目录。
示例:
import osentries = os.listdir('.')
print("当前目录下的文件和目录:", entries)
8. 高效遍历目录 — os.scandir(path)
功能说明:
- 返回一个迭代器,迭代器中的每个元素是
os.DirEntry
对象,包含文件名、路径和类型等信息。 - 比
os.listdir()
更高效,适合需要判断文件类型的场景。
示例:
import oswith os.scandir('.') as entries:for entry in entries:if entry.is_file():print(f"文件: {entry.name}")elif entry.is_dir():print(f"目录: {entry.name}")
9. 判断路径是否为文件 — os.path.isfile(path)
功能说明:
- 判断给定路径是否存在且是一个文件。
- 是文件返回
True
,否则返回False
。
示例:
import osif os.path.isfile('example.txt'):print("example.txt 是文件")
else:print("example.txt 不是文件")
10. 判断路径是否为目录 — os.path.isdir(path)
功能说明:
- 判断给定路径是否存在且是一个目录。
- 是目录返回
True
,否则返回False
。
示例:
import osif os.path.isdir('my_folder'):print("my_folder 是目录")
else:print("my_folder 不是目录")
11. 拼接路径 — os.path.join(path, *paths)
功能说明:
- 拼接多个路径片段,自动添加操作系统的路径分隔符(如Windows的
\
,Linux的/
)。 - 避免手动拼接带来的错误。
示例:
import osfull_path = os.path.join('folder', 'subfolder', 'file.txt')
print(full_path) # Windows: folder\subfolder\file.txt, Linux: folder/subfolder/file.txt
12. 获取绝对路径 — os.path.abspath(path)
功能说明:
- 返回指定路径的绝对路径。
- 若传入相对路径,转换为绝对路径。
示例:
import osabs_path = os.path.abspath('file.txt')
print(f"绝对路径是: {abs_path}")
五、总结
1)使用 open() 进行文件读写时,推荐采用 with 语句自动管理资源,避免忘记关闭文件导致的问题。
2)编写文件操作代码时,务必结合异常处理机制,捕获并处理可能出现的错误,提升程序的健壮性和稳定性。
3)利用 os 模块提供的丰富接口,实现文件和目录的创建、删除、遍历等常见操作,方便灵活地管理文件系统。
4)掌握 os.scandir() 等高效遍历目录的方法,能够显著提升文件系统操作的性能