第2课python_文件操作和异常机制
热度🔥:79 免费课程
授课语音
Python的文件操作和异常机制
1. 定义
文件操作
Python支持文本文件和二进制文件的操作,主要通过open
函数打开文件。常用的方法包括read
、write
、readlines
和close
等。打开文件时可以指定不同的模式:
'r'
:只读模式,默认模式。'w'
:写入模式,会覆盖文件,如果文件不存在则创建新文件。'a'
:追加模式,新的内容会添加到文件末尾。'b'
:二进制模式,用于处理二进制文件。'+'
:读写模式,可以同时读取和写入。
异常机制
异常是程序运行时发生的错误,Python通过try...except
块来处理异常。常见的异常类型包括FileNotFoundError
、IOError
和ValueError
等。异常处理的结构包括:
try
块:包含可能发生异常的代码。except
块:处理异常的代码。finally
块:无论是否发生异常,都会执行的代码,比如关闭文件流。
我们还可以自定义异常,通过继承Exception
类来创建自己的异常,这在实际项目中常用,以便更好地跟踪问题。
2. 代码案例
# 1. 文本文件的读写
# 写入文本文件
try:
# 使用with语句打开文件,确保文件在使用后自动关闭
with open('example.txt', 'w', encoding='utf-8') as file:
file.write("Hello, world!\n") # 写入一行文本
file.write("Welcome to file handling in Python.") # 写入另一行文本
except IOError as e:
print(f"写入文件失败: {e}") # 捕获写入文件时的IO错误
# 读取文本文件
try:
with open('example.txt', 'r', encoding='utf-8') as file:
content = file.read() # 读取文件的全部内容
print(f"读取文本文件内容:\n{content}") # 打印读取的内容
except IOError as e:
print(f"读取文件失败: {e}") # 捕获读取文件时的IO错误
# 2. 二进制文件的读写
# 写入二进制文件
try:
with open('example.bin', 'wb') as file:
file.write(b'\x00\x01\x02\x03\x04') # 写入字节数据
except IOError as e:
print(f"写入二进制文件失败: {e}") # 捕获写入二进制文件时的IO错误
# 读取二进制文件
try:
with open('example.bin', 'rb') as file:
binary_content = file.read() # 读取二进制文件的内容
print(f"读取二进制文件内容:\n{binary_content}") # 打印读取的二进制数据
except IOError as e:
print(f"读取二进制文件失败: {e}") # 捕获读取二进制文件时的IO错误
# 3. 文件的追加模式
# 追加文本到文件
try:
with open('example.txt', 'a', encoding='utf-8') as file:
file.write("\nAppending a new line.") # 追加一行文本
except IOError as e:
print(f"追加文本到文件失败: {e}") # 捕获追加文件时的IO错误
# 读取追加后的文本文件
try:
with open('example.txt', 'r', encoding='utf-8') as file:
updated_content = file.read() # 读取文件的全部内容
print(f"读取追加后的文本文件内容:\n{updated_content}") # 打印更新后的内容
except IOError as e:
print(f"读取追加后的文件失败: {e}") # 捕获读取追加文件时的IO错误
# 4. 文件的逐行读取
# 写入多行文本
try:
with open('example_lines.txt', 'w', encoding='utf-8') as file:
file.writelines([ # 写入多行文本
"Line 1\n",
"Line 2\n",
"Line 3\n"
])
except IOError as e:
print(f"写入多行文本失败: {e}") # 捕获写入多行文件时的IO错误
# 逐行读取文件
try:
with open('example_lines.txt', 'r', encoding='utf-8') as file:
for line in file: # 逐行读取文件
print(f"读取一行: {line.strip()}") # 去掉行末的换行符并打印
except IOError as e:
print(f"逐行读取文件失败: {e}") # 捕获逐行读取文件时的IO错误
# 5. 文件路径操作
import os
# 获取文件的绝对路径
file_path = os.path.abspath('example.txt')
print(f"文件的绝对路径: {file_path}") # 打印文件的绝对路径
# 检查文件是否存在
if os.path.exists(file_path):
print(f"文件 '{file_path}' 存在") # 文件存在
else:
print(f"文件 '{file_path}' 不存在") # 文件不存在
# 获取文件大小
try:
file_size = os.path.getsize(file_path) # 获取文件大小
print(f"文件大小: {file_size} bytes") # 打印文件大小
except OSError as e:
print(f"获取文件大小失败: {e}") # 捕获获取文件大小时的错误
# 6. 使用 `pathlib` 进行文件路径操作
from pathlib import Path
# 获取文件路径
path = Path('example.txt')
print(f"文件路径: {path}") # 打印文件路径
# 检查文件是否存在
print(f"文件存在: {path.exists()}") # 检查文件是否存在并打印
# 获取文件大小
try:
print(f"文件大小: {path.stat().st_size} bytes") # 获取并打印文件大小
except OSError as e:
print(f"获取文件大小失败: {e}") # 捕获获取文件大小时的错误
# 7. 读取大文件
# 模拟大文件的逐块读取
def read_large_file(file_path, chunk_size=1024):
try:
with open(file_path, 'r', encoding='utf-8') as file:
while chunk := file.read(chunk_size): # 逐块读取文件
print(f"读取块大小: {len(chunk)}") # 打印当前读取块的大小
except IOError as e:
print(f"读取大文件失败: {e}") # 捕获读取大文件时的IO错误
# 写入大文件
try:
with open('large_file.txt', 'w', encoding='utf-8') as file:
file.write("A" * 10**6) # 写入1MB的数据
except IOError as e:
print(f"写入大文件失败: {e}") # 捕获写入大文件时的IO错误
# 读取大文件
read_large_file('large_file.txt')
# 8. 使用 `shutil` 复制文件
import shutil
# 复制文件
try:
shutil.copy('example.txt', 'example_copy.txt') # 复制文件
print("文件复制成功") # 复制成功的提示
except IOError as e:
print(f"复制文件失败: {e}") # 捕获复制文件时的IO错误
# 确认复制成功
try:
with open('example_copy.txt', 'r', encoding='utf-8') as file:
copy_content = file.read() # 读取复制后的文件内容
print(f"复制文件内容:\n{copy_content}") # 打印复制文件的内容
except IOError as e:
print(f"读取复制文件失败: {e}") # 捕获读取复制文件时的IO错误
这段代码展示了如何在Python中进行文件的读写操作,以及如何处理异常情况。通过合理使用这些功能,可以有效地管理文件,确保程序的稳定性和可靠性。