首页 > 编程语言 >Python 文件和异常捕获(详解)

Python 文件和异常捕获(详解)

时间:2025-01-14 20:57:49浏览次数:3  
标签:文件 Python 异常 捕获 except try 详解 os 代码

        前言:在Python编码中,我们会学到python中的文件的读取与写入,当然还有对文件夹的操作,在文章的最后还有异常捕获的详细解释~~

一.文件的概念:

        有名称:每个文件都有一个文件名,用于在特定的文件系统中唯一标识该文件,方便用户和系统对文件进行识别、访问和管理,文件名一般由主文件名和扩展名组成,扩展名通常用于标识文件的类型。

        有存储位置:文件存储在计算机的存储介质上,如硬盘、固态硬盘、U 盘、光盘等,文件系统会为每个文件分配特定的存储位置和空间,以确保数据的存储和读取。

        数据有组织:文件中的数据可以按照特定的格式和结构进行组织,如文本文件中的字符序列、图像文件中的像素数据、音频文件中的音频采样数据等,不同类型的文件有不同的内部数据组织方式,以便于应用程序对其进行处理和解析。

一:open 函数

        python 提供内置函数 open()实现对文件的操作。python 对文本文件和二进制文件采用统一的操作步骤,和把大象放冰箱里的一样分三步,"打开-操作-关闭。"

open(file, mode='r', encoding=None)
 
#file 包含文件名的字符串,可以是绝对路径,可以是相对路径。
#mode 一个可选字符串,用于指定打开文件的模式。默认值 r 表示文本读。
#encoding 文本模式下指定文件的字符编码

eg:
open('ko.txt','r',encoding='utf-8')

mode参数:

字符       意义
'r'       文本读取(默认)
'w'       文本写入,并先清空文件(慎用),文件不存在则创建
'x'       文本写,排它性创建,如果文件已存在则失败
'a'       文本写,如果文件存在则在末尾追加,不存在则创建

和 mode 组合的字符:

字符    意义
'b'        二进制模式,例如:'rb'表示二进制读
't'        文本模式(默认),例如:rt 一般省略 t
'+'        读取与写入,例如:'r+' 表示同时读写

注意!总结:
虽然mode文件操作模式很多,但是我们只需要记住3个字符即可。r、w、a r+、w+、a+,代加号,功能全,既能读,⼜能写(区别在于指针到底指向不同) rb、wb、ab,代b的字符,代表以二进制的形式对其进行操作,适合读取文本或二进制格式⽂件,如图片、音频、视频等格式 rb+、wb+、ab+,代加号,功能全,既能读,又能写(区别在于指针到底指向不同)

二:读文件

绝对路径:绝对路径表示绝对概念,一般都是从盘符开始,然后一级一级向下查找(不能越级),直到找到我们要访问的文件即可。

相对路径:相对路径表示相对概念,不需要从盘符开始,首先需要找到一个参考点(就是Python文件本身)

平级关系:如果要访问的文件也Python代码处于同于目录,平行关系,同级的访问可以使用./文件名称,或者直接写文件名称即可。

上级关系:如果我们当前需要访问的文件位于当前Python代码的上一级目录,则我们可以通过../来访问上一级路径(如果是多级,也可以通过../../../去一层一层向上访问。

下级关系:如果我们要访问的文件在与Python代码同级的某个文件夹中,则我们可以通过文件夹名称/ 来访问某个目录下的文件
相对路径: 同级路径,都在同一个文件夹中,兄弟关系,如static目录下有file1.txt和file2.txt,则file1.txt和file2.txt就是同级关系,同级访问直接使用名称即可。 下一级路径,我们的文件与另外一个文件存在上下级关系,如images文件夹中存在一个avatar文件夹,则images是上级目录,avatar是下级目录。则我们访问avatar可以通过images/avatar来实现。 上一级路径,如果我们某些时候,向从当前目录下,跳出到外一层路径,我们可以使用 ../ 来实现
        

2.1先在当前目录创建一个目录

2.2写入内容:

操作步骤!(read()读操作)(当前我用的是绝对路径,记得用\\进行转义,不然会报错)
# 打开文件
f = open('E:\\python\\python-studen\\2024-节点飞思\\student\\xo.txt','r',encoding='utf-8')
# 读取文件
res = f.read()
# 打印文件内容
print(res)
#关闭文件
f.close()

读取方式当然读不止有read():

2.3读取方式:

read(size)方法 :主要用于文本类型或者二进制文件(图片、音频、视频...)数据的读取 size表示要从文件中读取的数据的长度(单位是字符/字节),如果没有传入size,那么就表示读取文件中所有的数据。 readline()方法 :一次读取一行内容,每运行一次readline()函数,其就会将文件的指针向下移动一行 readlines()方法 :主要用于文本类型数据的读取 readlines可以按照行的方式把整个文件中的内容进行一次性读取,并且返回的是一个列表,其中每一行的数据为一个元素。
read()
# 1、打开⽂件
f = open('python.txt', 'r', encoding='utf-8')
# 2、使⽤read()⽅法读取⽂件所有内容
contents = f.read()
print(contents)
# 3、关闭⽂件
f.close()
readline()
f = open('python.txt',encoding='utf-8') # 打开⽂件,encoding指定编码
while True:
 # 读取⼀⾏内容
 content = f.readline()
 # 判断是否读取到内容,如果没有则退出
 if not content:
 break
 # 如果读取到内容,则输出
 print(content, end='')
# 关闭⽂件,释放资源
f.close()
readlines()
# 1、打开⽂件
f = open('python.txt', 'r', encoding='utf-8')
# 2、读取⽂件
lines = f.readlines()
for line in lines:
 print(line, end='')
# 3、关闭⽂件
f.close()

注意!:二进制读取:# mode=rb,不需要encoding参数

三:写文件

操作步骤!(写操作)(mode='w')(请小心使用w模式,会清空原文件内容)

# 打开文件
f = open('E:\\python\\python-studen\\2024-节点飞思\\student\\xo.txt','w',encoding='utf-8')
# 写入内容
res = f.write('结束')
#关闭文件
f.close()
w模式:代表以只写模式打开一个文件,文件不存在,则自动创建该文件。w模式主要是针对文件写入而定义的模式。但是,要特别注意,w模式在写入时,光标也是置于第一行同时还会 清空原有文件内容 。
操作步骤!(写操作)(mode='a')
# 打开文件
f = open('E:\\python\\python-studen\\2024-节点飞思\\student\\xo.txt','a',encoding='utf-8')
# 写入内容
res = f.write('第二次结束')
#关闭文件
f.close()

tell 方法:文件对象的 tell 方法返回整数,表示文件指针距离文件开头的字节数

with open('a.txt', 'r', encoding='utf-8') as f:
    print(f.tell()) #文件指针距离文件开头的字节数
    content = f.read(3)
    print(content)
    print(f.tell())#文件指针距离文件开头的字节数

seek 方法:通过文件对象的 seek 方法可以移动文件句柄

seek 方法接收两个参数:
 
offset 表示偏移指针的字节数
whence 表示偏移参考,默认为 0
0 表示偏移参考文件的开头,offset 必须是 >=0 的整数
1 表示偏移参考当前位置,offset 可以是负数
2 表示偏移参考文件的结尾,offset 一般是负数

四:关闭文件

close():

        当你使用 open() 函数打开一个文件时,它会返回一个文件对象,你可以使用该对象的 close() 方法来关闭文件。

# 打开文件
f = open('E:\\python\\python-studen\\2024-节点飞思\\student\\xo.txt','r',encoding='utf-8')

#关闭文件
f.close()

with语句:

        with上下文管理:解决经常会忘记关闭文件句柄,造成资源浪费,所以处理文件是往往使用 with 语句进行上下文管理

with open('example.txt', 'r') as file:
    content = file.read()
    print(content)

五:os模块

        导入os模块,并且调用内部方法

# 导入模块
import os
# 调用方法
os.函数名()

一:与文件操作的相关方法

os.rename(旧文件名称,新文件名称):对文件进行重命名操作 os.remove(要删除文件名称):对文件进行删除操作
os.rename()
#调用模块
import os
#进行重命名
os.rename('b.txt','bbb.txt')
os.remove()
#调用模块
import os
#删除bbb.txt
os.remove('bbb.txt')

案例:把Python项目目录下的python.txt文件,更名为linux.txt,休眠20s,刷新后,查看效果,然后对这个文件进行删除操作。

# 第⼀步:导⼊os模块
import os
# 第三步:引⼊time模块
import time
# 第⼆步:使⽤os.rename⽅法对python.txt进⾏重命名
os.rename('python.txt', 'linux.txt')
# 第四步:休眠10s
time.sleep(10)
# 第五步:删除⽂件(linux.txt)
os.remove('linux.txt')

二:与文件夹的相关操作

os.mkdir(新文件夹名称)        创建一个指定名称的文件夹 os.getcwd()                           current work directory,获取当前目录名称 os.chdir(切换后目录名称)     change directory,切换目录 os.listdir(目标目录)               获取指定目录下的文件信息,返回列表 os.rmdir(目标目录)               用于删除一个指定名称的"空"文件夹
os.mkdir()
# 导⼊os模块
import os
# 引⼊time模块
import time
# 使⽤mkdir⽅法创建⼀个images⽂件夹
if not os.path.exists('images'):    # 判断images⽂件夹是否存在,不存在则创建
 os.mkdir('images')                 # 创建images⽂件夹
os.getcwd()
# 导⼊os模块
import os
# 获取当前目录名称
print(os.getcwd())
os.chdir()
# 导⼊os模块
import os
# 切换到上⼀级⽬录 => images
os.chdir('../../')
os.listdir()
# 导⼊os模块
import os
# 使⽤os.listdir打印当前所在⽬录下的所有⽂件,返回列表
print(os.listdir())
os.rmdir()
# 导⼊os模块
import os
# 删除空⽬录
os.rmdir('images/avatar') # 删除images⽂件夹

三:文件夹的删除

# 导⼊shutil模块,递归删除⾮空⽬录
import shutil
# 递归删除⾮空⽬录
shutil.rmtree('要删除⽂件夹路径')
        递归删除文件夹的原理:理论上,其在删除过程中,如果文件夹非空,则自动切换到文件夹的内部,然后把其内部的文件,一个一个删除,当所有⽂件删除完毕后,返回到一级目录,删除文件夹本身。

六:Python异常

异常的基本概念:

        在 Python 中,异常是一种在程序执行过程中出现的错误情况。当程序遇到错误,如除零错误、索引超出范围、文件不存在等情况时,就会引发异常。异常会中断当前的执行流程,除非被捕获并处理,否则程序会终止运行。

异常显示:

异常捕获:

基本语法:
        try...except:主要用于捕获代码运行时异常,如果异常发生,则执行except中的代码
try:
 可能发⽣错误的代码
except:
 如果出现异常执⾏的代码
异常处理的流程:

1.程序首先执行 try 代码块。

2.如果在 try 代码块中没有发生异常,except 代码块不会被执行。

3.如果发生异常,程序会跳转到匹配的 except 代码块,执行相应的异常处理代码。

4.如果没有匹配的 except 代码块,异常会向上传播到调用栈的上一级,直到被捕获或程序终止。

多异常处理:
 

可以使用多个 except 子句来处理不同类型的异常:

try:
    num = int("abc")  # 这会引发 ValueError
    result = 10 / num  # 这会引发 ZeroDivisionError
    print(result)
except ValueError:
    print("输入不是有效的数字")
except ZeroDivisionError:
    print("除数不能为零")
捕获多个异常:
 

可以将多个异常类型放在一个 except 子句中,使用元组:

try:
    num = int("abc")
    result = 10 / num
    print(result)
except (ValueError, ZeroDivisionError):
    print("输入错误或除数不能为零")

总结:

   try-except 语句是 Python 中处理异常的重要工具,它可以帮助你使程序更健壮,避免因未处理的异常而导致程序崩溃。根据可能出现的异常类型和情况,合理地使用 try-except 语句,可以使程序更加可靠,提高用户体验和代码的可维护性。

 
捕获异常并输出错误信息:
try:
 可能遇到的错误代码
except Exception as e:
 print(e)

代码实例:

try:
    # 可能引发异常的代码
    result = 10 / 0  # 这会引发 ZeroDivisionError
except ZeroDivisionError as e:
    # 捕获 ZeroDivisionError 异常并输出错误信息
    print(f"捕获到 ZeroDivisionError 异常:{e}")
except Exception as e:
    # 捕获其他未被特定处理的异常
    print(f"捕获到其他异常:{e}")

代码解释:

  1. try 块

    • 包含可能会引发异常的代码。在上述示例中,10 / 0 会导致 ZeroDivisionError 异常,因为除数不能为零。
  2. except ZeroDivisionError as e

    • 这部分用于专门捕获 ZeroDivisionError 异常。
    • as e 允许将异常对象存储在变量 e 中,以便在异常处理代码中使用。
    • 打印出 ZeroDivisionError 异常的具体信息,包括异常类型和异常消息。
  3. except Exception as e

    • 这是一个通用的异常捕获语句,用于捕获其他未被特定处理的异常。
    • Exception 是所有内置异常的基类,因此它可以捕获除 ZeroDivisionError 以外的其他异常。
    • 同样,as e 存储异常对象,以便打印异常信息。
异常捕获中else语句:

        else语句:表示的是如果没有异常要执行的代码。

        基本结构:

try:
    # 可能引发异常的代码块
except SomeException:
    # 当发生 SomeException 异常时执行的代码块
else:
    # 当 try 代码块中没有发生异常时执行的代码块

        代码实例:

try:
    result = 10 / 2  # 正常的除法运算
except ZeroDivisionError:
    print("除数不能为零")
else:
    print(f"结果是: {result}")

代码解释

 
  • try 代码块
    • 包含可能引发异常的代码。在这个例子中,10 / 2 是一个正常的除法运算,不会引发异常。
  • except ZeroDivisionError
    • 用于捕获 ZeroDivisionError 异常。由于 try 代码块中没有发生该异常,所以不会执行此代码块。
  • else 代码块
    • 当 try 代码块中没有发生异常时,执行此代码块。在这里,会打印出除法运算的结果。
异常捕获中finally语句:

基本概念:在 Python 的异常处理机制中,finally 子句是一个非常重要的部分,它的主要作用是确保无论 try 块中的代码是否引发异常,其中的代码都会被执行。

基本结构:

try:
    # 可能引发异常的代码块
except SomeException:
    # 当发生 SomeException 异常时执行的代码块
else:
    # 当 try 代码块中没有发生异常时执行的代码块
finally:
    # 无论是否发生异常都会执行的代码块

代码实例:

def divide(x, y):
    try:
        result = x / y
        print(f"结果是: {result}")
    except ZeroDivisionError:
        print("除数不能为零")
    finally:
        print("这是 finally 子句,总是会执行")


# 调用函数
divide(10, 2)
divide(10, 0)

代码解释

 
  • try 代码块
    • 包含可能引发异常的代码。在 divide(10, 2) 中,执行正常的除法运算,在 divide(10, 0) 中,会引发 ZeroDivisionError
  • except ZeroDivisionError
    • 当发生 ZeroDivisionError 异常时,会打印相应的错误信息。
  • finally 代码块
    • 无论是否发生异常,都会打印 "这是 finally 子句,总是会执行"

总结finally的作用:

   finally 通常用于释放资源,如关闭文件、关闭数据库连接、释放锁等,确保资源在使用后被正确释放,避免资源泄漏。

        即使 try 块中引发了异常或 except 块中引发了新的异常,finally 块中的资源清理代码仍然会执行。

        异常传播

        如果 finally 块中引发了异常,它会覆盖 try 或 except 块中引发的异常。                            在 finally 块中引发异常时要谨慎,避免掩盖了原有的异常。

        使用 finally 子句可以确保重要的操作(如资源清理)在任何情况下都能完成,提高代码的健壮性和可靠性,特别是在涉及资源管理时非常有用。

finally语句与else语句的区别:

else 子句

        只有在 try 块中没有发生异常时才会执行。

        主要用于在没有异常发生时执行正常的操作,使正常操作和异常处理分离。

finally 子句

        无论是否发生异常都会执行。

        侧重于资源清理和保证某些操作的最终执行。

好啦对于文件,文件夹,异常捕获的知识点讲解到这里就结束拉

标签:文件,Python,异常,捕获,except,try,详解,os,代码
From: https://blog.csdn.net/2301_78209919/article/details/145095324

相关文章

  • Python用Lasso改进线性混合模型Linear Mixed Model分析拟南芥和小鼠复杂性状遗传机制
    全文链接:https://tecdat.cn/?p=38800原文出处:拓端数据部落公众号在生物医学领域,探究可遗传性状的遗传基础是关键挑战之一。对于受多基因位点多因素控制的性状,准确检测其关联存在诸多困难,且易受群体结构等混杂因素影响产生假阳性结果。本文帮助客户建立Lasso线性混合模型,它能实现......
  • Python线性混合效应回归LMER分析大鼠幼崽体重数据、假设检验可视化
    全文链接:https://tecdat.cn/?p=38816原文出处:拓端数据部落公众号在数据分析领域,当数据呈现出层次结构时,传统的一般线性模型(GLM)可能无法充分捕捉数据的特征。混合效应回归作为GLM的扩展,能够有效处理这类具有层次结构的数据,如聚类数据、重复测量数据和纵向数据等。本文将深入探讨......
  • 关于python的初步学习
    python中的数据类型:整数(int):用于表示整数,例如-5,0,10等。浮点数(float):用于表示小数,例如3.14,-0.5等。字符串(str):用于表示文本,例如"Hello",'World'等。布尔值(bool):用于表示真或假,只有两个值,True和False。列表(list):用于存储一组有序的数据,可以包含不同类型的元素,例如[1,2,3]......
  • 【python】OpenCV—Extract Horizontal and Vertical Lines—Morphology
    文章目录1、功能描述2、代码实现3、效果展示4、完整代码5、参考更多有趣的代码示例,可参考【Programming】1、功能描述基于opencv-python库,利用形态学的腐蚀和膨胀,提取图片中的水平或者竖直线条2、代码实现导入基本的库函数importnumpyasnpimportcv2as......
  • Qt/C++ 基于回调模式的海康3D相机开发流程详解(附工程源码、开发文档下载链接)
    本文将基于海康3D相机SDK的回调模式,通过具体代码讲解如何完成从设备初始化到图像采集的完整流程。以下是标准的流程图和具体的开发步骤。一、开发流程概述流程分为以下几个关键步骤:运行环境初始化:调用MV3D_LP_Initialize(),初始化SDK运行环境。设备发现:调用MV3D_LP_Get......
  • 深度剖析RabbitMQ:从基础组件到管理页面详解
    文章目录一、简介二、Overview2.1Overview->Totals2.2Overview->Nodesbroker的属性2.3Overview->Churnstatistics2.4Overview->Portsandcontexts2.5Overview->Exportdefinitions2.6Overview->Importdefinitions三、Connections连接的属性四、Channels通道的......
  • 【python游戏】最经典的五个小游戏(完整代码)
    文章目录前言案例1:猜数字游戏案例2:石头剪刀布游戏案例3:使用pygame的简单打砖块游戏案例4:井字棋(Tic-Tac-Toe)案例5:贪吃蛇游戏(使用pygame)前言当然,我可以为你提供五个简单的Python游戏案例。这些游戏涵盖了不同的难度和类型,从文本冒险到简单的图形界面游戏。......
  • python 更新pip镜像源
    前言默认情况下pip使用的是国外的镜像,在下载的时候速度非常慢,下载速度是几kb或者几十kb,花费的时间比较长。解决办法国内目前有些机构或者公司整理了对应的镜像源,使得通过内网就能访问即可,下载速度达到几百kb或者几M,速度对比而言简直一个天上,一个地下。国内源:阿里云:http://m......
  • 用 Python 从零开始创建神经网络(二十二):预测(Prediction)/推理(Inference)(完结)
    预测(Prediction)/推理(Inference)(完结)引言完整代码:引言虽然我们经常将大部分时间花在训练和测试模型上,但我们这样做的核心原因是希望有一个能够接受新输入并生成期望输出的模型。这通常需要多次尝试训练最优模型,保存该模型,并加载已保存的模型进行推断或预测。以Fashion......
  • python+django/flask的大学生心理咨询平台java+nodejs+php-计算机毕业设计
    目录技术介绍具体实现截图微信开发者工具HBuilderXuniapp系统设计java类核心代码部分展示登录的业务流程的顺序是:可行性论证详细视频演示技术可行性系统测试系统安全性数据完整性实现思路系统实现源码获取技术介绍如今微信小程序有以下发展优势(1)无须下载,无须注......