Python文件篇(六)

文件操作

文件的读取与写入

打开文件(open() 函数):

sql 复制代码
file = open("文件路径", "模式")
  • 常用模式包括:

    • "r":读取模式,文件必须存在。
    • "w":写入模式,会覆盖原文件或创建新文件。
    • "a":追加模式,在文件末尾添加内容。
    • "b":二进制模式,适用于处理非文本文件(如图片、音频等)。
    • "r+":读写模式,文件必须存在。

读取文件内容:

sql 复制代码
file = open("example.txt", "r")
content = file.read()  # 读取整个文件内容
print(content)
file.close()
  • read():读取整个文件内容。
  • readline():按行读取文件内容,每次读取一行。
  • readlines():读取文件所有行,返回一个列表。

写入文件内容

sql 复制代码
file = open("example.txt", "w")
file.write("这是一个测试。\n")
file.writelines(["第一行\n", "第二行\n"])
file.close()
  • write():写入字符串到文件。
  • writelines():将一个字符串列表写入文件。

关闭文件(close() 方法):

sql 复制代码
file.close()

使用 with 语句: 使用 with 语句可以自动处理文件关闭,避免忘记关闭文件带来的资源泄露问题

sql 复制代码
with open("example.txt", "r") as file:
    content = file.read()
    print(content)

文件指针

文件指针是指向文件中当前位置的一个标记,它决定了从文件的哪个位置开始读写数据。文件指针的初始位置取决于文件打开的模式:

  • 如果以 "r"(读取)或 "r+"(读写)模式打开文件,文件指针最初位于文件的开头。
    如果以 "w"(写入)或 "a"(追加)模式打开文件,文件指针分别位于文件的开头或末尾

使用以下方法来控制文件指针的位置:

  • seek(offset, whence):移动文件指针。
  • offset:移动的字节数。
  • whence:移动的起点。常用的值有:
    • 0:文件开头(默认值)。
    • 1:当前位置。
    • 2:文件末尾。
sql 复制代码
file = open("example.txt", "r")
file.seek(5)  # 将文件指针移动到第5个字节处
content = file.read()  # 从第5个字节开始读取内容
print(content)
file.close()

tell():返回当前文件指针的位置

sql 复制代码
file = open("example.txt", "r")
position = file.tell()  # 获取当前文件指针位置
print(f"当前文件指针位置: {position}")
file.close()

异常处理

在Python中,异常处理是一种用于捕获和处理运行时错误的机制。当程序执行过程中遇到错误时,Python会引发一个异常,如果没有处理这个异常,程序就会终止运行。为了防止程序崩溃并提供更好的用户体验,可以使用异常处理机制

try, except, else, finally

常处理使用 try-except 结构。基本语法如下

sql 复制代码
try:
    # 尝试执行的代码
    可能会引发异常的代码
except 异常类型 as 异常变量:
    # 发生异常时执行的代码
    处理异常的代码
finally:
    # 无论是否发生异常,都会执行的代码
    清理资源的代码
  1. try 块

    try 块中的代码是你认为可能会引发异常的部分。Python会尝试执行这些代码,如果没有异常,程序会正常继续执行。如果发生异常,程序会跳到对应的 except 块。

  2. except 块

    except 块用于捕获和处理异常。你可以指定要捕获的异常类型,并在 except 块中定义如何处理这些异常。你可以捕获特定类型的异常,也可以捕获所有异常。

捕获特定异常:

sql 复制代码
try:
    x = 1 / 0
except ZeroDivisionError as e:
    print(f"捕获到异常: {e}")

捕获所有异常:

sql 复制代码
try:
    x = 1 / 0
except Exception as e:
    print(f"捕获到异常: {e}")
  1. else 块(可选)
    else 块在 try 块中没有发生异常时执行。它通常用于执行那些只有在成功完成 try 块中代码时才应该执行的操作。
sql 复制代码
try:
    x = 10 / 2
except ZeroDivisionError:
    print("发生除零错误")
else:
    print("成功执行,没有异常")
  1. finally 块(可选)
    finally 块中的代码无论是否发生异常,都会执行。它通常用于清理资源,比如关闭文件或网络连接。
sql 复制代码
try:
    file = open("example.txt", "r")
    content = file.read()
except FileNotFoundError:
    print("文件未找到")
finally:
    file.close()
    print("文件已关闭")

自定义异常

可以通过继承内置的 Exception 类来创建自己的异常类。自定义异常通常用于在特定情况下引发特定的错误,以便更灵活地处理异常情况。

sql 复制代码
class MyCustomError(Exception):
    def __init__(self, message):
        self.message = message

try:
    raise MyCustomError("这是一个自定义异常")
except MyCustomError as e:
    print(f"捕获到自定义异常: {e.message}"

案例实操

编写一个程序,读取用户指定的文件内容并计算其中的单词数量。如果文件不存在或出现其他错误

sql 复制代码
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:文件存在且读取成功

python 复制代码
请输入要读取的文件名:example.txt
文件 'example.txt' 中有 50 个单词。
文件处理结束。

情况2:文件不存在

python 复制代码
请输入要读取的文件名:nonexistent.txt
错误:文件 'nonexistent.txt' 未找到。请检查文件名和路径是否正确。
文件处理结束。

情况3:文件权限不足

python 复制代码
请输入要读取的文件名:restricted.txt
错误:没有权限读取文件 'restricted.txt'。
文件处理结束。

情况4:发生其他未知错误

如果发生了其他未预料到的错误,比如编码问题,程序会捕获通用的 Exception 异常并显示错误信息

python 复制代码
请输入要读取的文件名:corrupted.txt
发生错误:'utf-8' codec can't decode byte 0x80 in position 0: invalid start byte
文件处理结束。
相关推荐
亿牛云爬虫专家12 分钟前
如何通过subprocess在数据采集中执行外部命令 —以微博为例
爬虫·python·数据采集·多线程·代理ip·subprocess·微博
技术无疆13 分钟前
ButterKnife:Android视图绑定的简化专家
android·java·android studio·android-studio·androidx·butterknife·视图绑定
ZachOn1y22 分钟前
Java 入门指南:JVM(Java虚拟机)垃圾回收机制 —— 垃圾收集器
java·jvm·后端·java-ee·团队开发·个人开发
敲代码不忘补水29 分钟前
Python Pickle 与 JSON 序列化详解:存储、反序列化与对比
开发语言·python·json
攸攸太上36 分钟前
Java通配符的作用
java·学习·通配符
齐 飞1 小时前
使用jackson将xml和对象、List相互转换
xml·java·spring boot·后端·list
liwulin05061 小时前
java-在ANTLR中BaseListner的方法和词法规则的关系0.5.0
java·开发语言
范特西是只猫1 小时前
echarts 自定义标注样式&自定义tooltip弹窗样式
前端·javascript·echarts
SofterICer1 小时前
PE-PINCodes 规则
java
归去来兮★1 小时前
c++面向对象
java·开发语言·c++