文件的读取与写入
打开文件(open() 函数):
file = open("文件路径", "模式")
-
常用模式包括:
- “r”:读取模式,文件必须存在。
- “w”:写入模式,会覆盖原文件或创建新文件。
- “a”:追加模式,在文件末尾添加内容。
- “b”:二进制模式,适用于处理非文本文件(如图片、音频等)。
- “r+”:读写模式,文件必须存在。
读取文件内容:
file = open("example.txt", "r")
content = file.read() # 读取整个文件内容
print(content)
file.close()
- read():读取整个文件内容。
- readline():按行读取文件内容,每次读取一行。
- readlines():读取文件所有行,返回一个列表。
写入文件内容
file = open("example.txt", "w")
file.write("这是一个测试。\n")
file.writelines(["第一行\n", "第二行\n"])
file.close()
- write():写入字符串到文件。
- writelines():将一个字符串列表写入文件。
关闭文件(close() 方法):
file.close()
使用 with 语句: 使用 with 语句可以自动处理文件关闭,避免忘记关闭文件带来的资源泄露问题
with open("example.txt", "r") as file:
content = file.read()
print(content)
文件指针
文件指针是指向文件中当前位置的一个标记,它决定了从文件的哪个位置开始读写数据。文件指针的初始位置取决于文件打开的模式:
- 如果以 “r”(读取)或 “r+”(读写)模式打开文件,文件指针最初位于文件的开头。
如果以 “w”(写入)或 “a”(追加)模式打开文件,文件指针分别位于文件的开头或末尾
使用以下方法来控制文件指针的位置:
- seek(offset, whence):移动文件指针。
- offset:移动的字节数。
- whence:移动的起点。常用的值有:
- 0:文件开头(默认值)。
- 1:当前位置。
- 2:文件末尾。
file = open("example.txt", "r")
file.seek(5) # 将文件指针移动到第5个字节处
content = file.read() # 从第5个字节开始读取内容
print(content)
file.close()
tell():返回当前文件指针的位置
file = open("example.txt", "r")
position = file.tell() # 获取当前文件指针位置
print(f"当前文件指针位置: {position}")
file.close()
异常处理
在Python中,异常处理是一种用于捕获和处理运行时错误的机制。当程序执行过程中遇到错误时,Python会引发一个异常,如果没有处理这个异常,程序就会终止运行。为了防止程序崩溃并提供更好的用户体验,可以使用异常处理机制
try, except, else, finally
常处理使用 try-except 结构。基本语法如下
try:
# 尝试执行的代码
可能会引发异常的代码
except 异常类型 as 异常变量:
# 发生异常时执行的代码
处理异常的代码
finally:
# 无论是否发生异常,都会执行的代码
清理资源的代码
-
try 块
try 块中的代码是你认为可能会引发异常的部分。Python会尝试执行这些代码,如果没有异常,程序会正常继续执行。如果发生异常,程序会跳到对应的 except 块。 -
except 块
except 块用于捕获和处理异常。你可以指定要捕获的异常类型,并在 except 块中定义如何处理这些异常。你可以捕获特定类型的异常,也可以捕获所有异常。
捕获特定异常:
try:
x = 1 / 0
except ZeroDivisionError as e:
print(f"捕获到异常: {e}")
捕获所有异常:
try:
x = 1 / 0
except Exception as e:
print(f"捕获到异常: {e}")
- else 块(可选)
else 块在 try 块中没有发生异常时执行。它通常用于执行那些只有在成功完成 try 块中代码时才应该执行的操作。
try:
x = 10 / 2
except ZeroDivisionError:
print("发生除零错误")
else:
print("成功执行,没有异常")
- finally 块(可选)
finally 块中的代码无论是否发生异常,都会执行。它通常用于清理资源,比如关闭文件或网络连接。
try:
file = open("example.txt", "r")
content = file.read()
except FileNotFoundError:
print("文件未找到")
finally:
file.close()
print("文件已关闭")
自定义异常
可以通过继承内置的 Exception 类来创建自己的异常类。自定义异常通常用于在特定情况下引发特定的错误,以便更灵活地处理异常情况。
class MyCustomError(Exception):
def __init__(self, message):
self.message = message
try:
raise MyCustomError("这是一个自定义异常")
except MyCustomError as e:
print(f"捕获到自定义异常: {e.message}"
案例实操
编写一个程序,读取用户指定的文件内容并计算其中的单词数量。如果文件不存在或出现其他错误
def count_words_in_file(filename):
try:
# 尝试打开文件
with open(filename, 'r') as file:
content = file.read()
# 计算单词数量
words = content.split()
word_count = len(words)
print(f"文件 '{filename}' 中有 {word_count} 个单词。")
except FileNotFoundError:
# 捕获文件未找到的异常
print(f"错误:文件 '{filename}' 未找到。请检查文件名和路径是否正确。")
except PermissionError:
# 捕获文件权限不足的异常
print(f"错误:没有权限读取文件 '{filename}'。")
except Exception as e:
# 捕获其他异常
print(f"发生错误:{e}")
finally:
# finally 块会在程序结束时执行
print("文件处理结束。")
# 示例:用户输入文件名进行操作
filename = input("请输入要读取的文件名:")
count_words_in_file(filename)
运行结果
情况1:文件存在且读取成功
请输入要读取的文件名:example.txt
文件 'example.txt' 中有 50 个单词。
文件处理结束。
情况2:文件不存在
请输入要读取的文件名:nonexistent.txt
错误:文件 'nonexistent.txt' 未找到。请检查文件名和路径是否正确。
文件处理结束。
情况3:文件权限不足
请输入要读取的文件名:restricted.txt
错误:没有权限读取文件 'restricted.txt'。
文件处理结束。
情况4:发生其他未知错误
如果发生了其他未预料到的错误,比如编码问题,程序会捕获通用的 Exception 异常并显示错误信息
请输入要读取的文件名:corrupted.txt
发生错误:'utf-8' codec can't decode byte 0x80 in position 0: invalid start byte
文件处理结束。