异常捕获和文件操作
异常捕获
1、异常 - 程序报错
当程序出现异常,程序直接结束
# print('abc'[5]) # IndexError: string index out of range
2、异常捕获
异常捕获就是让程序出现异常的时候不崩溃还可以接着往后执行
1)语法: – 捕获所有的异常
try:
代码段1(需要捕获异常的代码)
except:
代码段2(捕获到异常后会执行的代码)
2)执行过程:
先执行代码段1,如果代码段1在执行过程中出现了异常,程序不崩溃,直接执行代码段2,执行完代码段2才继续执行后续代码
try:
print('----')
print('asd'[4])
print('sxsa')
except:
print('前面出现了异常')
练习:提示用户输入年龄,请求将输入的年龄值转换成整数。如果年龄输入有误,给出 ‘年龄必须是整数!’ 的提示
try:
age = int(input('请输入年龄:'))
except:
print('年龄必须是整数!')
3、异常捕获的其他语法
语法2: - 捕获指定的一种异常
try:
代码段1(需要捕获异常的代码)
except 异常类型:
代码段2(捕获到异常后会执行的代码)
其他代码
语法3: - 同时捕获多种异常,针对不同的异常做相同的处理
try:
代码段1(需要捕获异常的代码)
except (异常类型1,异常类型2,异常类型3……):
代码段2(捕获到异常后会执行的代码)
其他代码
语法4: - 同时捕获多种异常,针对不同的异常做不一样的处理
try:
代码段1(需要捕获异常的代码)
except 异常类型1:
代码段11
except 异常类型2:
代码段22
except:
代码段33
其他代码
语法2
try:
age = int(input('请输入年龄:'))
print(age + 'adad')
except ValueError:
print('输入有误,年龄必须是整数!')
语法:3:
try:
age=int(input('请输入年龄:'))
print(age+'abc')
except (TypeError,ValueError):
print('输入或打印的类型有错')
4.finally - 不管发生什么都会执行
finally后面的代码不管被捕获的代码发生了什么都会执行(就算try后面的代码出现异常没有捕获到异常,finally后面的代码都会执行)
try:
代码段1(需要捕获异常的代码)
except:
代码段2(捕获到异常后会执行的代码)
2)执行过程:
先执行代码段1,如果代码段1在执行过程中出现了异常,程序不崩溃,直接执行代码段2,执行完代码段2才继续执行后续代码
finally:
代码段
其他语法都是最后加finally
try:
print({'a':10}['b'])
except IndexError:
print('下标越界')
finally:
print('写遗书')
print('其他语句')
5、抛出异常
raise 异常类型
class AgeEroor(Exception):
def __str__(self):
return '年龄值的有效范围0~200'
age=int(input('请输入年龄:'))
if age > 200 or age < 0:
raise AgeEroor
文件操作
1、数据持久化(数据本地化)
默认情况下程序中的数据都是保存在内存中,运行内存中是数据在程序结束的时候自动销毁
如果希望结束之后数据不销毁就必须将数据以文件的形式保存在硬盘中
常用的文件格式:数据库文件(sqlit、db)、json文件(.json)、plist文件(.plist)、表格文件(xls、xlsx、csv)、二进制文件(图片、视频、音频)、普通文件(.txt)
2、文件操作(文件内容的操作) I/O操作
基本步骤:打开文件 -> 操作文件(读、写) -> 关闭文件
1)打开文件
open(file,mode=‘r’,*,encoding=None) - 以指定模式打开指定文件,并且返回文件对象
file - 需要打开的文件在计算机中的位置(文件路径)
绝对路径:文件在计算机中的全路径
相对路径:在写路径的时候用一个点或者多个点表示文件绝对路径的一部分
. - 表示当前目录(当前目录指的是当前写代码的文件所在的目录)
… - 表示当前目录的上层目录
… - 表示当前目录的上层目录的上层目录
注意:如果只有一个点,这个点可以省略
mode - 决定打开文件后能进行的操作是能写还是能读?同时决定操作文件的时候的对应文件类型是字符串还是二进制(总共两种值)
第一类值:控制读写
r - 只读(默认);如果打开文件不存在会报错 FileNotFoundError。
w - 只写;会先清空原文件的内容,如果打开文件不存在不会报错,会自动创建,如果文件夹不存在会报错。
a - 只写;会保留原文件的内容,如果打开文件不存在不会报错,会自动创建,如果文件夹不存在会报错。
第二类值:控制操作数据类型
t - 文本模式,对应的数据类型是字符串str(文本文件才可以用t来打开)(默认)
b - 二进制模式,对应的数据类型是bytes
案例:rt、tr、r;rb,br;tw、wt、w;at、ta、a ;ab、ba
encoding - 设置文本文件的编码方式(只能在以t的模式打开文本文件的时候才能设置)
一般设置成utf-8,原则:对同一个文件进行读和写的时候打开对应的编码的方式一致
open(r'D:\python上课\1语言基础\day13exception_handling_and_ file_operations\test') # 全路径
open('./test') # 相对路径
open('test')
一类:
第一个参数:r
f=open('test','r')
f.read()
f.write('abc') # io.UnsupportedOperation: not writable
第二个参数:w
f=open('test','w')
f.write('abc')
f.read() # io.UnsupportedOperation: not readable
第三个参数:a
f=open('test','a')
f.write('ana')
第二类:
第一个参数:t
f=open('test','rt')
result=f.read()
print(type(result)) # <class 'str'>
第二个参数:b
f=open('test','rb')
result=f.read()
print(type(result)) # <class 'bytes'>
打开不存在的文件
f=open('test2','r') # FileNotFoundError: [Errno 2] No such file or directory: 'test2'
f=open('test2','w')
f=open('test3','a',encoding='utf-8')
2)操作文件
a、读
文件对象.read() - 从读写位置开始读到文件结束
f=open('test','r')
result=f.read()
print(result)
f.seek(0) # 将读写位置移动到文件开头
result=f.read()
print(result)
文本对象.readlines() - 从读写位置开始读到文件结束返回的是列表,列表的每个元素是每一行的内容(只能针对文本文件有效)
f=open('test','r')
result=f.readlines()
print(result)
文本对象.readline() - 从读写位置开始读到一行结束(只能针对文本文件有效)
f=open('test','r')
result=f.readline()
print(result) # ana
写操作
文件对象.write(内容)
f=open('test','w')
f.write('abc')
从网页下载图片
import requests
response=requests.get('https://ss1.bdstatic.com/70cFvXSh_Q1YnxGkpoWK1HF6hhy/it/u=3875736606,1006868333&fm=26&gp=0.jpg')
f=open('宝儿姐.jpg','bw')
f.write(response.content)
关闭文件 – 文件操作完之后需要关闭文件
文件对象.close()
f=open('test')
print(f.read())
f.close()
print(f.read()) # ValueError: I/O operation on closed file.
自动关闭操作
with open(file,mode=‘r’,encoding=None) as 文件对象:
操作文件
with open('test') as f :
print(f.read())
# print(f.read()) # ValueError: I/O operation on closed file.
数据持久化
数据持久化的方法
第一步:先确定需要持久化的数据是什么
第二步:创建文件保持需要持久化的数据的初始值
第三步:在程序中需要这个数据的时候从文件中读出来
第四步:如果程序中修改了这个数据,要将最新的数据更新在新的文件中
写程序,打印当前执行的次数
def print_count():
with open('count.txt',encoding='utf-8')as f:
count=int(f.read())
count+=1
print(count)
with open('count.txt','w',encoding='utf-8')as f :
f.write(str(count))
print_count()
案例2:保存曾经添加的所有的名字
value = input('请输入数据:')
with open('name.txt', encoding='utf-8') as f:
result = f.read()
names = eval(result)
names.append(value)
print(names)
with open('name.txt', 'w', encoding='utf-8') as f:
f.write(str(names))
运行过程:
请输入数据:abc
[‘abc’]
请输入数据:xiaoming
[‘abc’, ‘xiaoming’]
请输入数据:小花
[‘abc’, ‘xiaoming’, ‘小花’]
eval的用法
str1 = "[10, 20, 30]" # [10, 20, 30]
result = eval(str1)
print(result) # [10, 20, 30]
print(type(result)) # <class 'list'>
print(result[-1]) # 30
str2 = "{'a': 10, 'b': 20}" # {'a': 10, 'b': 20}
result = eval(str2)
print(result) # {'a': 10, 'b': 20}
print(type(result)) # <class 'dict'>
print(result['a']) # 10
abc = 100
str3 = '[abc, 10, 20, 30]' # [abc, 10, 20, 30]
result = eval(str3) # NameError: name 'abc' is not defined
print(result)
作业
while True:
print('** 欢迎来到XX管理系统 **')
print(' ☠ 1.登录\n ☠ 2.注册\n ☠ 3.退出')
n=int(input('请选择(1~3)'))
if n ==1:
try:
name=input('请输入账号(3~6位):')
key=input('请输入密码(6~12):')
with open('name.txt',encoding='utf-8') as f:
result=f.read()
dict1=eval(result)
if dict1[name] == key:
print('登录成功')
break
else:
print('密码或者账号错误,登录失败')
except:
print('该账号没有被注册,登录失败')
elif n == 2:
name = input('请输入账号(3~6位):')
key = input('请输入密码(6~12):')
with open('name.txt', encoding='utf-8') as f:
result = f.read()
result = eval(result)
if name not in result:
result.setdefault(name,key)
with open('name.txt', 'w', encoding='utf-8')as f:
f.write(str(result))
print('注册成功')
else:
print('注册失败,该账号存在')
elif n ==3:
print('退出')
break