六、文件操作
6.1、文件的打开和编码
1)编码:编码有很多,只有编码和解码使用的编码格式相同的时候才会正常的进行读和写
UTF-8是目前全球通用的编码格式,除非有特殊要求,否则一律使用UTF-8的文件编码
2)打开文件:使用open()函数,open函数可以打开一个以经存在的文件,或者创建一个新文件
语法:open(name,mode,encoding)
-
name :要打开的文件名(可以包含文件的具体路径)
-
mode:设置文件的打开模式(只读,写入,追加等)
-
encoding:编码格式(推荐使用UTF-8)
# 打开文件
f = open("python.txt",'r',encoding='UTF-8')
# f 是open文件函数的对象,且encoding的顺序不是第三位,不能使用位置参数,用关键字参数直接指定
文件模式:
-
r:以只读方式打开,文件的指针将会放到文件的开头,这是默认模式
-
w:打开文件用于写入,如果文件以经存在,指针会从头开始,原有内容会被删除,如果文件不存在,则会创建新文件
-
a:打开文件用于追加,如果文件存在,新的内容将会写到已有内容之后,如果文件不存在,就会创建新文件进行写入
文件的关闭:文件对象.close()方法
6.2、文件的读取
注意:一个文件操作中如果多次调用读取方法,指针会从上一次r读取结束时开始
1)read()方法:有参数表示从文件中读取的数据长度(单位字节),无参数,表示读取文件的所有数据
# 格式:文件对象.read()
# 打开文件
f = open("文件名",'r',encoding='UTF-8')
# 读取文件
element = f.read()
# 关闭文件
f.close()
2)readlines()方法:可以按照行的方式把整个文件的内容进行一次性读取,并且返回一个列表,每一行的数据为一个元素
# 格式:文件对象.readlines()
f = open("文件名",'r',encoding='UTF-8')
# 读取文件
element = f.readlines()
# 关闭文件
f.close()
3)readline()方法:一次读取一行内容(遇到换行符结束一行)
# 格式:文件对象名.readline()
f = open("文件名",'r',encoding='UTF-8')
# 读取文件
element = f.readline()
print(f"第一行:{element}")
element = f.readline()
print(f"第二行:{element}")
# 关闭文件
f.close()
4)for循环读取文件:
# 每一个line临时变量,就记录了文件的一行数据
for line in open("文件名",'r'):
print(line)
# 关闭文件
f.close()
5)with open语法:操作完成后自动关闭文件
# 语法:with open("文件名","r")as 文件对象:
with open("文件路径",'r') as f:
f.readlines()
6.3、文件的写入和追加
# 打开文件
f = open("文件名",'w',encoding='UTF-8')
# 文件写入
f.write("内容")
# 内容刷新
f.flush()
# 关闭文件(内置了flush方法,可以只写close方法)
f.close()
-
注意:直接调用write,内容并未真正写入文件,而是积攒在内存中,称为缓冲区,当调用flush的时候,才会真正的写入文件中,这样可以避免频繁操作硬盘,导致效率下降
-
文件的追加:只需将模式改成"a"模式
6.4、案例
# 写入数据
def write_infor(self):
try:
file = open("./students.txt", 'w', encoding='utf-8')
except:
print("文件更新失败!")
else:
print("正在更新文件信息········")
time.sleep(3)
# 将类对象转为字典类型存入文件------格式:类对象.__dict__
dict_infor = [item.__dict__ for item in self.student_list]
file.write(str(dict_infor))
print("更新成功········")
file.close()
# 读取文件数据
def read_infor(self):
try:
file = open("./students.txt", 'r', encoding='utf-8')
except:
print("文件不存在!无法加载数据,请先进行添加数据,更新文件信息·······")
else:
print("正在读取文件信息········")
time.sleep(3)
# 文件中读取的数据都是字符串嵌套列表嵌套字典,使用eval将其转化为列表,在使用for取出字典的值转换为类对象
new_list = eval(file.read())
self.student_list = [Student(item['id'], item['name'], item['age'], item['gender'], item['tel']) for item in new_list]
print("文件读取成功~~~")
file.close()
七、异常处理与模块
7.1、捕获异常
# 基本语法:(相当于捕获全部异常)
try:
可能发生错误的代码
except:
出现异常执行的代码
1)捕获指定异常:如果出现的异常类型和要捕获的异常类型不一致,就无法捕获
# 基本语法:
try:
可能发生错误的代码
except 异常类型 as 别名:
出现异常执行的代码
注意:这里的别名输出出来就是异常出现的原因
2)捕获多个异常:将要捕获的异常以元组的方式书写在except后面,逗号隔开
# 基本语法:
try:
可能发生的错误代码
except (类型1,类型2) as 别名:
出现异常执行的代码
3)捕获全部异常:
# 基本语法:
try:
可能发生的错误代码
except Exception as 别名:
出现异常执行的代码
4)异常else:表示如果没有出现异常所执行的代码
# 语法:
try:
可能发生的错误代码
except Exception as 别名:
出现异常执行的代码
else:
没有出现异常执行的代码
5)异常finally:表示无论有无异常都要执行的代码(例如:关闭文件)
# 语法:
try:
可能发生的错误代码
except Exception as 别名:
出现异常执行的代码
else:
没有出现异常执行的代码
finally:
无论如何都要执行