Python入门9:文件操作与异常处理

一、文件的概念

1.1、什么是文件

内存中存放的数据在计算机关机后就会消失。要⻓久保存数据,就要使⽤硬盘、光盘、U 盘等设备。为 了便于数据的管理和检索,引⼊了"⽂件"的概念。
⼀篇⽂章、⼀段视频、⼀个可执⾏程序,都可以被保存为⼀个⽂件,并赋予⼀个⽂件名。操作系统以⽂ 件为单位管理磁盘中的数据。⼀般来说,⽂件可分为⽂本⽂件、视频⽂件、⾳频⽂件、图像⽂件、可执 ⾏⽂件等多种类别。

1.2、文件有哪一些操作

在⽇常操作中,我们对⽂件的主要操作:创建⽂件、打开⽂件、⽂件读写、⽂件备份等等

二、文件的基本操作

2.1、文件操作三步走

  1. 打开文件 :使用open()函数获取文件对象,为后续操作做准备。

  2. 操作文件 :通过文件对象提供的方法,如read()write()等,对文件内容进行读取或写入。

  3. 关闭文件 :操作完成后,调用close()方法释放文件资源,确保数据正确保存。

2.2、open()函数打开文件

语法:

python 复制代码
f = open(name, mode)

2.2.1、文件的相对路径和绝对路径(name)

文件路径类型:① 绝对路径 ② 相对路径
① 绝对路径:绝对路径表示绝对概念, ⼀般都是从盘符开始, 然后⼀级⼀级向下查找(不能越级),直 到找到我们要访问的⽂件即可。
② 相对路径:相对路径表示相对概念, 不需要从盘符开始, ⾸先需要找到⼀个参考点(就是Python⽂件本身)
路径的小常识:
① 同级路径,都在同⼀个⽂件夹中,兄弟关系,如static⽬录下有file1.txt和file2.txt,则file1.txt和
file2.txt就是同级关系,同级访问直接使⽤名称即可。
② 下⼀级路径,我们的⽂件与另外⼀个⽂件存在上下级关系,如images⽂件夹中存在⼀个avatar⽂件
夹,则images是上级⽬录,avatar是下级⽬录。则我们访问avatar可以通过images/avatar来实现。
③ 上⼀级路径 ,如果我们某些时候,向从当前⽬录下,跳出到外⼀层路径,我们可以使⽤ ../ 来实现。 上两个路径 ,我们可以通过 ../../ 来实现。

2.2.2、文件操作的mode模式(mode)

|-----|---------------------------------------------------------------------------------------|
| 模式 | 描述 |
| r | 以只读⽅式打开⽂件。 ⽂件的指针将会放在⽂件 的开头。这是默认模式。 |
| rb | 以⼆进制格式打开⼀个⽂件⽤于只读 。⽂件指针 将会放在⽂件的开头。这是默认模式。 |
| r+ | 打开⼀个⽂件⽤于读写。 ⽂件指针将会放在⽂件 的开头。 |
| rb+ | 以⼆进制格式打开⼀个⽂件⽤于读写。 ⽂件指针 将会放在⽂件的开头。 |
| w | 打开⼀个⽂件只⽤于写⼊ 。如果该⽂件已存在则 打开⽂件,并从开头开始编辑,即 原有内容会被 删除 。如果该⽂件不存在, 创建新⽂件 。 |
| wb | 以⼆进制格式打开⼀个⽂件只⽤于写⼊ 。如果该 ⽂件已存在则打开⽂件,并从开头开始编辑,即 原有内容会被删除。如果该⽂件不存在,创建新 ⽂件。 |
| w+ | 打开⼀个⽂件⽤于读写。 如果该⽂件已存在则打 开⽂件,并从开头开始编辑,即原有内容会被删 除。如果该⽂件不存在,创建新⽂件。 |
| wb+ | 以⼆进制格式打开⼀个⽂件⽤于读写。 如果该⽂ 件已存在则打开⽂件,并从开头开始编辑,即原 有内容会被删除。如果该⽂件不存在,创建新⽂ 件。 |
| a | 打开⼀个⽂件⽤于追加。 如果该⽂件已存在,⽂ 件指针将会放在⽂件的结尾。也就是说, 新的内 容将会被写⼊到已有内容之后。 如果该⽂件不存 在,创建新⽂件进⾏写⼊。 |
| ab | 以⼆进制格式打开⼀个⽂件⽤于追加。 如果该⽂ 件已存在,⽂件指针将会放在⽂件的结尾。也就 是说,新的内容将会被写⼊到已有内容之后。如 果该⽂件不存在,创建新⽂件进⾏写⼊。 |
| a+ | 打开⼀个⽂件⽤于读写。 如果该⽂件已存在,⽂ 件指针将会放在⽂件的结尾。⽂件打开时会是追 加模式。如果该⽂件不存在,创建新⽂件⽤于读 写。 |
| ab+ | 以⼆进制格式打开⼀个⽂件⽤于追加。 如果该⽂ 件已存在,⽂件指针将会放在⽂件的结尾。如果 该⽂件不存在,创建新⽂件⽤于读写。 |

2.3、write()函数写入文件

语法:

python 复制代码
f.write('要写⼊的内容,要求是⼀个字符串类型的数据'

2.4、close()函数关闭文件

关闭文件是一个好习惯,可以避免资源泄露和数据丢失。

python 复制代码
f.close()

2.5、入门案例

代码:

python 复制代码
# 通过w的方式打开文件
fw = open("test.txt",mode="w")
# 对文件进行写操作(存在,覆盖文件;不存在,则创建文件)
fw.write("人生苦短,小宁学Python!!!")
# 关闭文件
fw.close()

运行结果:我们会发现在目录下面创建了一个test.txt的文件,当时发生了中文乱码

代码:

python 复制代码
# 打开文件
fw = open("test.txt",mode="w")
# 对文件进行写操作(存在,覆盖文件;不存在,则创建文件)
fw.write("adshuduh")  # 改变文件写入的内容(全部是英文)
# 关闭文件
fw.close()

运行结果:通过改变write()写入的内容,test.txt里面的内容会发生改变,之前的内容会去不消失,原因是当我们使用write()写入内容的时候,如果文件存在,那么原来的内容会被删除,然后写入新的内容。

2.6、⽂件的读取操作(解决中文乱码问题)

通过我们前面对打开文件的open(name,mode)的了解,我们发现文件除了write写操作外,还有读a追加的操作。正对上一个案例,我们发现,当我们写入中文的时候,会发生中文乱码的现象,那么这种现象我们要这么解决呢。

1、read(size)⽅法 :主要⽤于⽂本类型或者⼆进制⽂件(图⽚、⾳频、视频...)数据的读取。
size表示要从⽂件中读取的数据的⻓度(单位是字符/字节) , 如果没有传⼊size,那么就表示读取⽂件 中所有的数据。

python 复制代码
# 不传入size参数:
fr = open("test.txt",mode="r")
msg = fr.read()
print("test.txt这个文件读出了这些内容:",msg)
fr.close()
python 复制代码
# 传入size参数:
fr = open("test.txt",mode="r")
msg = fr.read(2)
print("test.txt这个文件读出了这些内容:",msg)
fr.close()

2、readlines()⽅法 :主要⽤于⽂本类型数据的读取。

readlines可以按照⾏的⽅式把整个⽂件中的内容进⾏⼀次性读取,并且返回的是⼀个 列表 ,其中每⼀⾏ 的数据为⼀个元素。
在test.txt中写入多行数据(包括中文):

使用 encoding="utf-8" 解决中文乱码问题:

python 复制代码
# 使用encoding="utf-8"解决中文乱码问题
fr = open("test.txt","r",encoding="utf-8")
msg = fr.readlines()
for i in msg:
    print(i,end="")  # 逐行输出每一行的内容
print(type(msg))  # 返回的数据类型是列表
fr.close()


3、 readline() ⽅法 :⼀次读取⼀⾏内容, 每运⾏⼀次readline()函数,其就会将⽂件的指针向下移动⼀⾏。

python 复制代码
fr = open("test.txt","r",encoding="utf-8")
msg = fr.readline()
msg1 = fr.readline()
msg2= fr.readline()
print(msg)
print(msg1)
print(msg2)
fr.close()

2.7、对write()操作的注意事项,和对read()操作的注意事项

1、write()操作的注意事项: write会将数据先写到缓存区域,待程序结束后才会写入文件中。

python 复制代码
import time
 # 会生成一个aa.txt的文件
fw = open("aa.txt","w",encoding="utf-8")
 # 在aa.txt中写入"小宁爱Python!"
fw.write("小宁爱Python!")
# 使用time模块睡眠10秒,发现要程序执行结束后才会写入
time.sleep(10)  
fw.close()

执行程序:

执行结束(睡眠结束):才生成aa.txt的文件

解决方法:使用文件操作的flush()函数

python 复制代码
import time
 # 会生成一个aa.txt的文件
fw = open("aa.txt","w",encoding="utf-8")
 # 在aa.txt中写入"小宁爱Python!"
fw.write("小宁爱Python!")
#解决这一问题可以使用flush解决写入数据需要程序结束后才写入的问题
fw.flush() 
# 使用time模块睡眠10秒,发现要程序执行结束后才会写入
time.sleep(10)  
fw.close()
复制代码
2、文件read操作的注意事项:如果read读取文件,要程序结束后才能输出读取的内容,且不能对文件进行其它操作(删除),所以我们加上close就能解决该问题。

代码:

python 复制代码
import time
fr = open("aa.txt","r",encoding="utf-8")
msg = fr.read()
print(msg)
# 睡眠10秒,发现如果程序没有执行完,对aa.txt文件进行不了删除等操作
time.sleep(10)

解决方法:

python 复制代码
# 文件read操作的注意事项:如果read读取文件,要程序结束后才能输出读取的内容,
# 且不能对文件进行其他操作(删除),所以我们加上close就能解决该问题
import time
fr = open("aa.txt","r",encoding="utf-8")
msg = fr.read()
print(msg)
# 及时关闭文件
fr.close()
time.sleep(10)

2.8、 with open("name","mode") as 文件对象

经过上面的讲解我们来接到关闭文件是一个很重要的操作,为了避免我们有时候忘记关闭文件,所以Python这种方法。它是一种非常常用且推荐的文件操作方式。这种方式可以自动管理文件的打开和关闭,即使在文件操作过程中发生异常,也能确保文件被正确关闭。这不仅使代码更加简洁,还能避免资源泄露。

案例:实现将桌面上我的头像粘贴到当前目录:

python 复制代码
# 读取图片的信息:
with open("C:\\Users\\32156\\Desktop\\img.png",mode="rb") as f:
     msg = f.read()
# 将图片写发到当前路径下的my_img.png文件中:
with open("my_img.png",mode="wb") as f_image:
     f_image.write(msg)

运行结果:

三、文件的备份案例

python 复制代码
# 1、接收⽤户输⼊的⽂件名(要备份的⽂件名)
oldname = input('请输⼊要备份的⽂件名称:') # python.txt
# 2、规划备份⽂件名(python[备份].txt)
index = oldname.rfind('.') # 从右边开始查找,找到第⼀个的下标
# 对index进⾏判断,判断是否合理(index > 0)
if index > 0:
     # 返回⽂件名和⽂件后缀
     name = oldname[:index] # 切⽚,获取⽂件名
     postfix = oldname[index:] # 切⽚,获取⽂件后缀
     newname = name + '[备份]' + postfix # 拼接
     # 3、对⽂件进⾏备份操作
     old_f = open(oldname, 'rb') # 以⼆进制读模式打开⽂件
     new_f = open(newname, 'wb') # 以⼆进制写模式打开⽂件
     # 读取源⽂件内容写⼊新⽂件
     while True:
         content = old_f.read(1024) # 每次读取1024字节
         if len(content) == 0: # 判断是否读取完毕,如果读取完毕,则停⽌
             break
         new_f.write(content) # 写⼊新⽂件
     # 4、关闭⽂件,释放资源
     old_f.close()
     new_f.close()
else:
     print('请输⼊正确的⽂件名称,否则⽆法进⾏备份操作...')

运行结果:

四、文件和文件夹操作(OS模块)

在Python中有对文件和文件夹操作的模块,我们只要用import os 导入文件操作的模块,然后调用os中的模块就可以对文件进行相关的操作了。

4.1、文件的相关操作方法

|------------------------|------------|
| os.rename(旧⽂件名称,新⽂件名称) | 对⽂件进⾏重命名操作 |
| os.remove(要删除⽂件名称) | 对⽂件进⾏删除操作 |

案例:
把Python项⽬⽬录下的python.txt⽂件,更名为小宁爱Python.txt,休眠10s,刷新后,查看效果,然后对这个⽂件进⾏删除操作。

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

运行结果:程序没有运行结束前我们先把"python.txt"打开所在的文件夹,然后我们可以发现程序还没有结束(睡眠十秒),名字就会发生改变,十秒过后文件就会被删除。

4.2、文件夹的相关操作

|--------------------------|---------------------------------|
| os.rename(旧⽂件夹名称,新⽂件夹名称) | 对⽂件夹进⾏重命名操作 |
| os.remove(要删除⽂件夹名称) | 对⽂件夹进⾏删除操作 |
| os.mkdir(新⽂件夹名称) | 创建⼀个指定名称的⽂件夹 |
| os.getcwd() | current work directory,获取当前⽬录名称 |
| os.chdir(切换后⽬录名称) | change directory,切换⽬录 |
| os.listdir(⽬标⽬录) | 获取指定⽬录下的⽂件信息,返回列表 |
| os.rmdir(⽬标⽬录) | ⽤于删除⼀个指定名称的"空"⽂件夹 |

4.2.1、案例1:

python 复制代码
# 导入模块
import os
import time
# 使mkdir创建一个文件:
if not os.path.exists('小宁爱Python'):# 判断⽂件夹是否存在,不存在则创建
    os.mkdir('小宁爱Python')
if not os.path.exists("小宁爱Python/python"):# 判断⽂件夹是否存在,不存在则创建
    os.mkdir("小宁爱Python/python") # 在小宁爱Python文件下创建Python
# 获取当前目录
res = os.getcwd()
print(res)
# 切换目录
os.chdir("小宁爱Python/python")
res1 = os.getcwd()
print(res1)
# 切换回上两级目录
os.chdir("../../")
res2 = os.getcwd()
print(res2)
# 不传参表示获取当前文件下的目录,返回的数据为列表
res3 = os.listdir()
print(res3)
# 删除空目录:(只能删除空文件)
time.sleep(10) # 使用sleep函数睡眠,观看是否创建
os.rmdir("小宁爱Python/python")

4.3、⽂件夹删除补充(递归删除、慎重!)

在前面文件夹的操作中我们了解到了删除空文件夹我们可以使用os.rmdir()函数进行删除,但是它只是针对于空的文件夹,那么我们遇到不是空文件夹的时候我们要如何实现删除呢?其实Python中有shutil模块,直接调用该模块中的retrree()函数就可以实现删除非空文件夹了。

案例:删除"非空文件夹"

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

运行结果:

五、Python异常

5.1、什么是异常

当检测到⼀个错误时,解释器就⽆法继续执⾏了,反⽽出现了⼀些错误的提示,这就是所谓的"异常"。

5.2、异常捕获(try---except---)

语法:

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

案例:

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

文件不存在:

再执行一次,文件存在时:

5.3、捕获异常并输出错误的信息

语法:

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

案例:

当存在python.txt文件时:

python 复制代码
try:
    with open("python.txt",mode="r",encoding="utf-8") as file:
        print("执⾏try语句中的代码")
        res = file.read()
        print("文件的内容为:",res)
except Exception as e:
    with open("python.txt",mode="w",encoding="utf-8") as file1:
        print("执⾏except语句中的代码")
        file1.write(str(e))
    with open("python.txt",mode="r",encoding="utf-8") as file2:
        res1 = file2.read()
        print("发生的错误是:",res1)

当不存在python.txt文件时:

5.4、异常捕获(try---except---else---)

语法:表示的是如果没有异常要执⾏的代码。

python 复制代码
try:
     可能会发生错误的代码
except:
     发生错误会执行的代码
else:
     没有发生错误会执行的代码

案例:

python 复制代码
# 用户输入两个数字,对这两个数字进行求和操作
# 如果没有发生错误将结果放大十倍,并输出
# 如果发生错误,那么打印错误,并提醒用户输入的不是数字
num1 = input("请输入第一个数字:")
num2 = input("请输入第二个数字:")
try:
    add = int(num1) + int(num2)
    print(f"求和的结果为:{add}")
except Exception as e:
    print("你输入的不是数字!!!")
    print(e)
else:
    add = add * 10
    print(f"将求和结果放大十倍的结果为:{add}")

正确输入:

错误输入:

5.5、异常捕获(try---except---else---finally)

语法:

python 复制代码
try:
     可能会发生错误的代码
except:
     发生错误会执行的代码
else:
     没有发生错误会执行的代码
finaly:
    不管是否发生错误都会执行的代码

案例:

python 复制代码
try:
      f = open('python.txt', 'r', encoding='utf-8')
      print("执⾏try语句中的代码")
except:
      print("执⾏except语句中的代码")
      f = open('python.txt', 'w', encoding='utf-8')
      f.write('发⽣异常,执⾏except语句中的代码')
else:
      print("没有异常,执⾏else语句中的代码")
      content = f.readlines()
      print(content)
finally:
      print("不论是否有异常出现,都将执⾏finally语句中的代码")
      f.close()

不存在python.txt文件时:

存在python.txt文件时:

相关推荐
地衣君12 分钟前
服务器一次性部署One API + ChatGPT-Next-Web
服务器·前端·chatgpt·aigc·oneapi
墨绿色的摆渡人24 分钟前
用 Python 从零开始创建神经网络(二十一):保存和加载模型及其参数
人工智能·python·深度学习·神经网络·机器学习
群联云防护小杜43 分钟前
如何通过高防服务隐藏服务器源IP
运维·服务器·开发语言·网络·网络协议·tcp/ip
迷路爸爸1801 小时前
PyTorch 中的 Dropout 解析
人工智能·pytorch·python·dropout
Hi202402171 小时前
RK3588-NPU pytorch-image-models 模型编译测试
人工智能·pytorch·python·rk3588·onnx·推理
圆圆滚滚小企鹅。1 小时前
刷题记录 回溯算法-10:93. 复原 IP 地址
数据结构·python·算法·leetcode
蒙娜丽宁1 小时前
【人工智能】从Keras到TensorFlow 2.0:深入掌握Python深度学习技术
人工智能·python·深度学习
昵称难产中1 小时前
浅谈云计算10 | 服务器虚拟化支撑技术(长文)
运维·服务器·云计算
凯哥是个大帅比1 小时前
Pycharm 使用教程
ide·python·pycharm
m0_dawn2 小时前
(蓝桥杯)二维数组前缀和典型例题——子矩阵求和
python·学习·算法·职场和发展·蓝桥杯