【详解】Python基础(12):Python文件基本操作与异常处理

练习最大的收获就是先进行模仿,在发现问题,解决问题,最后掌握!

**上一篇文章题目:**Python基础(11):Python中函数参数的进阶模式详解

链接: https://blog.csdn.net/2501_94250394/article/details/156545219?spm=1001.2014.3001.5502


前言

时间过得真快,陆陆续续就已经马上把Python基础知识分享完毕了,希望小伙伴们能有所收获,这也是我分享这些内容的初心。同时后续也要给小伙伴们开启另一个篇章,一段新的旅程,希望大家能收获满满。

一、文件的概念

什么是文件?

内存是"临时工作区 ",断电后数据会彻底消失;硬盘、U盘、光盘等属于非易失性存储设备,能长久留存重要数据。

为了高效管理和快速检索数据,操作系统引入了"文件"这一核心概念。文档、音视频、程序等各类数据,都会被封装成独立文件并赋予专属文件名,无需关心数据的物理存储位置,仅凭文件名就能快速访问。

操作系统以文件为基本单位管理外存数据常见类型包括文本文件、视频文件、音频文件、图像文件和可执行文件等,不同类型对应不同的使用场景。

文件操作是指?有哪些作用

在日常办公,我们对文件的主要操作包括:创建文件、打开文件、文件读写、文件备份等等;文件操作的作用就是把一些内容(数据)存储存放起来,可以让程序下一次执行的时候直接使用,而不必重新制作一份,省时省力。

二、文件的基本操作

2.1 open函数打开文件

在Python,使用open()函数,可以打开一个已经存在的文件,或者创建一个新文件,语法如下:

python 复制代码
f = open(name, mode)
注:返回的结果是一个file文件对象(后续会学习,只需要记住,后续方法都是f.方法())

注意:

name:是要打开的目标文件名的字符串(可以包含文件所在的具体路径)。

mode:设置打开文件的模式(访问模式):只读r、写入w、追加a等。

2.1.1 基本模式及区别:

r模式: 只读模式,仅支持读取操作 、无法修改文件。文件必须已存在,否则会直接报错,打开后光标默认定位在文件开头。

w模式: 只写模式,仅支持写入操作 。文件不存在时会自动创建 ,若文件已存在 ,打开时会清空原有内容,光标定位在文件开头。

a模式:追加模式,仅支持写入操作 。文件不存在时会自动创建,不会清空原有内容,光标默认定位在文件尾部,新内容会直接追加到末尾。

2.1.2 文件路径

具体分为两种路径:绝对路径 、 相对路径

**绝对路径:**绝对路径是文件的完整地址,一般都是从盘符开始,然后一级一级向下查找(不能越级),不依赖当前目录,精准定位目标,直到找到我们要访问的文件即可。

比如访问C盘路径下的Python文件夹下面的python.txt文件,其完整路径:

python 复制代码
Windows
C:\Python\python.txt
Linux
/usr/local/nginx/conf/nginx.conf

注意: 绝对路径的核心问题是与文件的**物理存储位置强绑定,**一般路径固定了,文件就不能进行移动,另外在迁移过程中会比较麻烦。

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

同级关系: 我们要访问的文件与Python代码处于同一个目录,平行关系,同级关系的访问可以使用./文件名称或者直接写文件名称即可

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

下级关系: 如果我们要访问的文件在与Python代码同级的某个文件夹中,则我们可以通过文件夹名称/来访问某个目录下的文件

python 复制代码
#假设下面的内容是我们的具体pycharm页面里面的目录结构
项目文件夹/
├─ main.py  (当前执行文件,所有相对路径都基于它)
├─ data.txt  (同级文件)
├─ 资源文件夹/  (同级子文件夹)
│  └─ note.txt  (下级文件)
│  └─ 风景.jpg  (下级图片文件)
└─ 上级文件夹/
   └─ config.ini  (上级文件)

#同级关系(操作 main.py 同级的 data.txt)
# name=同级路径(简化写法),mode=r(只读)
f = open("data.txt", "r", encoding="utf-8")  # encoding指定文本编码,避免乱码
content = f.read()  # 读取文件内容
print(content)  # 打印内容
f.close()  # 关闭文件(必须执行,释放资源)


#上级关系(操作 main.py 上一级的 config.ini)
# name=上级路径(../ 表示上一级目录),mode=r
f = open("../上级文件夹/config.ini", "r", encoding="utf-8")
config = f.read()
print(config)
f.close()

#下级关系(操作 main.py 同级子文件夹的文件)
# name=下级路径(文件夹名/文件名),mode=r
f = open("资源文件夹/note.txt", "r", encoding="utf-8")
note = f.read()
print(note)
f.close()

注意:为什么需要写encoding="utf-8"?

不同系统的默认文字翻译规则不一样(Windows 常用 GBK,Linux/macOS 常用 UTF-8),不指定encoding="utf-8"的话,读写含中文、特殊符号的文件很容易出现乱码

拓展:编码是指?有哪些作用?主要编码方式?

编码就是计算机的"文字翻译字典"------给每个字符(汉字、英文、标点等)分配唯一二进制编号,让只认0和1的计算机能存储、处理人类文字,相当于给每个字办了张"数字身份证"。

核心作用是解决"文字在计算机里怎么存、怎么传":确保不同设备能准确交换文本、适配全球语言符号,同时合理节省存储空间和传输带宽,避免出现"乱码"问题

主要编码方式有:

ASCII:基础编码,优点是简单占用小,缺点是不支持中文。

GBK:中文专用,兼容ASCII,支持简繁体中文,适合Windows中文环境,缺点是不支持全球语言。

UTF-8:全球通用,兼容ASCII,支持所有语言和符号,是互联网和跨平台首选,缺点是中文占用(3字节)比GBK多。

2.2 文件的读取操作

**read(size)方法:**主要用于文本类型或者二进制文件(图片、音频、视频...)数据的读取

size表示要从文件中读取的数据的长度(单位是字符/字节),如果没有传入size,那么就表示读取文件中所有的数据。

python 复制代码
f.read()  # 读取文件的所有内容
f.read(1024)  # 读取1024个字符长度文件内容,字母或数字

案例:

大家可以在Pycharm里面创建一个文件或案例里面相同的文件名,自己随便写点内容试试

python 复制代码
# 1、打开文件
f = open('python.txt', 'r', encoding='utf-8')
# 2、使用read()方法读取文件所有内容
contents = f.read()
print(contents)
# 3、关闭文件
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()

**readline()方法:**一次读取一行内容,每运行一次readline()函数,其就会将文件的指针向下移动一行

案例:

python 复制代码
f = open('python.txt', encoding="utf-8")  # 加 encoding 避免中文乱码

while True:
    content = f.readline()  
    if not content:
        break
    print(content)

f.close()

注意: 不知道大家发现上面都需要写f.close(),它的主要作用是释放被打开文件(比如代码中的 python.txt)占用的系统资源,避免资源浪费,同时解除文件锁定,让后续能正常修改、删除该文件。

拓展:

打开文件(比如代码里 `f = open('python.txt')`)时,系统会把文件的相关信息(加载到内存中,相当于给文件在内存里占了个"临时工位"。

f.close()释放文件,核心就是清空这个"临时工位",避免内存一直被闲置的文件占用导致浪费,甚至影响电脑运行速度。

2.3 文件操作的mode模式

虽然mode文件操作模式很多,但是我们只需要记住3个字符即可。r、w、a,其他进行了解即可

三、with-open语句的使用

现在给小伙伴们介绍一个另一种文件操作方式, 不用手动 close()释放资源了, 该语句会在执行完毕后, 自动释放资源。

with-open格式:

python 复制代码
with open("文件路径", "模式", encoding="utf-8") as f1(别名), open("文件路径", "模式", encoding="utf-8") as f2(别名):
    # 语句体:
    # 语句体示例:读取f1内容、写入f2等操作,
    content = f1.read()
    f2.write(content)

案例:

python 复制代码
# 核心逻辑:循环读取源文件数据(每次读8192字节,平衡效率与内存占用),逐段写入目标文件

# 1. 同时打开源文件(待拷贝的文件)和目标文件(拷贝后的文件)
# - src_f:源文件别名,rb=二进制只读模式(读取非文本文件必须用二进制模式)
# - dest_f:目标文件别名,wb=二进制只写模式(写入非文本文件必须用二进制模式)
# - with语句:自动管理文件关闭,无需手动写close(),避免资源泄露
with open('./data/a.txt', 'rb') as src_f, open('./data/b.txt', 'wb') as dest_f:
    # 2. 循环拷贝:持续读取源文件数据,直到读完所有内容
    while True:
        # 2.2 一次读取8192字节(1KB=1024字节,即每次读8KB)
        # 为什么选8192?:既不会因单次读太少导致频繁IO(效率低),也不会因读太多占用过多内存
        data = src_f.read(8192)
        
        # 2.3 判断是否读取完毕:二进制文件读完后返回空字节串(b''),len(data)会等于0
        # 注意:二进制模式下不能用 data == '' 判断(''是文本空字符串,与二进制空串b''不同)
        if len(data) <= 0:
            break
        
        # 2.4 写入数据:将本次读取到的二进制数据,完整写入目标文件
        # 二进制模式写入无需指定encoding,直接写入字节数据即可
        dest_f.write(data)

四、Python异常

4.1 异常捕获

**异常:**就是检测到一个错误时,解释器就无法继续执行了,反而出现了一些错误的提示,这就是所谓的"异常"。

案例演示:

python 复制代码
# 文件读取异常
f = open('python.txt', 'r')
content = f.readlines()
print(content)

#出现的问题
#  以只读文本模式打开文件(未指定 encoding,中文可能乱码;未处理文件不存在等异常)
#  未写 f.close()

面对上面的情况我们就要进行异常捕获,帮助我们防止代码报错无法运行。

异常捕获基本语法:

python 复制代码
#try...except主要用于捕获代码运行时异常,如果异常发生,则执行except中的代码
try:
    可能发生错误的代码
except:
    如果出现异常执行的代码

案例:

python 复制代码
try:
    f = open('python.txt', 'r')
    content = f.readline()
    print(content)
except:
    f = open('python.txt', 'w', encoding='utf-8')
    f.write('发生异常,执行except语句中的代码')
f.close()

4.2 重点解读

捕获异常并输出错误信息

无论我们在except后面定义多少个异常类型,实际应用中,也可能会出现无法捕获的未知异常 。这个时候,我们考虑使用Exception异常类型 捕获可能遇到的所有未知异常

python 复制代码
try:
    可能遇到的错误代码
except Exception as e:
    print(e)

案例:

python 复制代码
#打印一个未定义变量,使用Exception异常类进行捕获
try:
    print(name)
except Exception as e:
    print(e)

异常捕获中else语句:

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

python 复制代码
# else语句:表示的是如果没有异常要执行的代码。
try:
    print(1)
except Exception as e:
    print(e)
else:
    print('哈哈,真开森,没有遇到任何异常')

案例:

python 复制代码
try:
    f = open('python.txt', 'r')
except Exception as e:
    print(e)
else:
    content = f.readlines()
    print(content)
    f.close()

异常捕获中的finally语句:

finally表示的是无论是否异常都要执行的代码,例如关闭文件

python 复制代码
# finally表示的是无论是否异常都要执行的代码,例如关闭文件
try:
    f = open('python.txt', 'r')
except:
    f = open('python.txt', 'w')
else:
    content = f.readlines()
    print(content)
finally:
    f.close()

五、练习案例

案例1:反转文件内容.按行读取文件内容, 对每行的内容进行反转后, 写到另1个文件中。

文件和内容大家可以自己构建

实现思路:

① 读取两个文件,并且将读取到的文件存储到一个列表中

② 遍历文件行中所有的内容,去除行末换行符,使用切片方式翻转内容

③ 将翻转后的内容加载到一个新的列表中

④将新列表的中的内容以文件的方式写到本地磁盘另一个文件

案例2:升级猜数字游戏,增加程序健壮性,用户在输入过程中可能不会输入数字或者不按照要求输入,程序要能捕获到用户的异常输入。在已有的猜数游戏中加入异常功能。

六、Python基础知识总结

今天关于文件的操作挺有趣的,估计有小伙伴也发现了,文件操作好像可以变成爬虫的一部分,但还事实上肯定没有那么简单,还需要深造才行,并且多数网站都会有反爬虫机制。


今天基本上Python基础知识分享完毕了,后续会给大家分享一个利用开源模型搭建的简单智能体和各类有趣的实用AI工具集合。期待后续的扣子操作分享。


上述内容会根据大家的评论和实际情况进行实时更新和改进。

麻烦小伙伴们动一动发财的小手,给小弟点个赞和收藏,如果能获得小伙伴的关注将是我无上的荣耀和前进的动力。

小伙伴们,我是AI大佬的小弟,希望大家喜欢!!!

晚安,兄弟们。

相关推荐
songroom7 小时前
python: 扣子工作流创建与dbpystream api 自主插件开发
python
山土成旧客7 小时前
【Python学习打卡-Day36】实战重构:用PyTorch神经网络升级信贷预测项目
python·学习·重构
27669582927 小时前
dy x-tt-session-dtrait 逆向分析
python·node·dy·dy逆向·抖音请求头逆向·session-dtrait·dtrait
小途软件7 小时前
基于深度学习的驾驶人情绪识别
java·人工智能·pytorch·python·深度学习·语言模型
Kratzdisteln7 小时前
【MVCD 7】
python·pygame
向量引擎7 小时前
[架构师级] 压榨GPT-5.2与Sora 2的极限性能:从单体调用到高并发多模态Agent集群的演进之路(附全套Python源码与性能调优方案)
开发语言·人工智能·python·gpt·ai·ai写作·api调用
逻极7 小时前
数据分析项目:Pandas + SQLAlchemy,从数据库到DataFrame的丝滑实战
python·mysql·数据分析·pandas·sqlalchemy
小白学大数据7 小时前
Java 异步爬虫高效获取小红书短视频内容
java·开发语言·爬虫·python·音视频
luoluoal8 小时前
基于python的英汉电子词典软件(源码+文档)
python·mysql·django·毕业设计·源码
我想吃烤肉肉8 小时前
Python 中 asyncio 是什么?
爬虫·python·自动化