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

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

一.文件的概念:

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

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

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

一:open 函数

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

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()读操作)(当前我用的是绝对路径,记得用\\进行转义,不然会报错)
python 复制代码
# 打开文件
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()
python 复制代码
# 1、打开⽂件
f = open('python.txt', 'r', encoding='utf-8')
# 2、使⽤read()⽅法读取⽂件所有内容
contents = f.read()
print(contents)
# 3、关闭⽂件
f.close()
readline()
python 复制代码
f = open('python.txt',encoding='utf-8') # 打开⽂件,encoding指定编码
while True:
 # 读取⼀⾏内容
 content = f.readline()
 # 判断是否读取到内容,如果没有则退出
 if not content:
 break
 # 如果读取到内容,则输出
 print(content, end='')
# 关闭⽂件,释放资源
f.close()
readlines()
python 复制代码
# 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模式,会清空原文件内容)

python 复制代码
# 打开文件
f = open('E:\\python\\python-studen\\2024-节点飞思\\student\\xo.txt','w',encoding='utf-8')
# 写入内容
res = f.write('结束')
#关闭文件
f.close()

w模式:代表以只写模式打开一个文件,文件不存在,则自动创建该文件。w模式主要是针对文件写入而定义的模式。但是,要特别注意,w模式在写入时,光标也是置于第一行同时还会 清空原有文件内容 。
操作步骤!(写操作)(mode='a')

python 复制代码
# 打开文件
f = open('E:\\python\\python-studen\\2024-节点飞思\\student\\xo.txt','a',encoding='utf-8')
# 写入内容
res = f.write('第二次结束')
#关闭文件
f.close()

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

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

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

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

四:关闭文件

close():

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

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

#关闭文件
f.close()

with语句:

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

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

五:os模块

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

python 复制代码
# 导入模块
import os
# 调用方法
os.函数名()

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

os.rename(旧文件名称,新文件名称):对文件进行重命名操作
os.remove(要删除文件名称):对文件进行删除操作

os.rename()
python 复制代码
#调用模块
import os
#进行重命名
os.rename('b.txt','bbb.txt')
os.remove()
python 复制代码
#调用模块
import os
#删除bbb.txt
os.remove('bbb.txt')

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

python 复制代码
# 第⼀步:导⼊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()
python 复制代码
# 导⼊os模块
import os
# 引⼊time模块
import time
# 使⽤mkdir⽅法创建⼀个images⽂件夹
if not os.path.exists('images'):    # 判断images⽂件夹是否存在,不存在则创建
 os.mkdir('images')                 # 创建images⽂件夹
os.getcwd()
python 复制代码
# 导⼊os模块
import os
# 获取当前目录名称
print(os.getcwd())
os.chdir()
python 复制代码
# 导⼊os模块
import os
# 切换到上⼀级⽬录 => images
os.chdir('../../')
os.listdir()
python 复制代码
# 导⼊os模块
import os
# 使⽤os.listdir打印当前所在⽬录下的所有⽂件,返回列表
print(os.listdir())
os.rmdir()
python 复制代码
# 导⼊os模块
import os
# 删除空⽬录
os.rmdir('images/avatar') # 删除images⽂件夹

三:文件夹的删除

python 复制代码
# 导⼊shutil模块,递归删除⾮空⽬录
import shutil
# 递归删除⾮空⽬录
shutil.rmtree('要删除⽂件夹路径')

递归删除文件夹的原理:理论上,其在删除过程中,如果文件夹非空,则自动切换到文件夹的内部,然后把其内部的文件,一个一个删除,当所有⽂件删除完毕后,返回到一级目录,删除文件夹本身。

六:Python异常

异常的基本概念:

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

异常显示:

异常捕获:

基本语法:

try...except:主要用于捕获代码运行时异常,如果异常发生,则执行except中的代码

python 复制代码
try:
 可能发⽣错误的代码
except:
 如果出现异常执⾏的代码
异常处理的流程:

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

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

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

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

多异常处理:

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

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

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

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

总结:

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

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

代码实例:

python 复制代码
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语句:表示的是如果没有异常要执行的代码。

基本结构:

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

代码实例:

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

代码解释

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

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

基本结构:

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

代码实例:

python 复制代码
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 块中引发了异常,它会覆盖 tryexcept 块中引发的异常。 在 finally 块中引发异常时要谨慎,避免掩盖了原有的异常。

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

finally语句与else语句的区别:

else 子句

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

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

finally 子句

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

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

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

相关推荐
北京迅为几秒前
【北京迅为】iTOP-4412全能版使用手册-第七十七章 Qt串口编程
linux·嵌入式硬件·4412开发板
爱python的王三金4 分钟前
【数据分析实战】马来西亚吉隆坡景点评论分析:多维度游客体验与运营优化洞察
大数据·python·nlp·数据可视化
Jacob_AI8 分钟前
大模型——RAG
数据库·人工智能·算法
二当家的素材网13 分钟前
SDK调用文心一言如何接入,文心一言API接入教程
linux·运维·服务器
Loving_enjoy19 分钟前
Python|【Pytorch】基于小波时频图与SwinTransformer的轴承故障诊断研究
pytorch·python
哟哟耶耶25 分钟前
improve-gantt-elastic(vue2中甘特图实现与引入)
前端·甘特图
程序员二.黑26 分钟前
接口自动化入门 : Http的请求头,请求体,响应码解忻!
运维·软件测试·python·测试工具·http·自动化
maply43 分钟前
npm 方式安装Pyodide 详解
前端·python·npm·node.js·pyodide
三劫散仙44 分钟前
conda 依赖固定和 pip 依赖使用的区别
python·conda·pip
千禧年@1 小时前
html辅助标签与样式表
前端·chrome·html