浅谈Python中的异常和JSON读写数据的实现
作者:大坑水滴 发布时间:2021-02-07 10:41:16
异常可以防止出现一些不友好的信息返回给用户,有助于提升程序的可用性,在java中通过try ... catch ... finally来处理异常,在Python中通过try ... except ... else来处理异常
一、以ZeroDivisionError为例,处理分母为0的除法异常
def division(numerator,denominator):
result=numerator/denominator
return result
ret1=division(1,5)
print(ret1)
ret2=division(1,0)
print(ret2)
1/5执行正常,输出0.2,但1/0,分母为0,抛出Traceback,该信息看起来非常不友好,try .. except可以获取这些异常信息,并且允许转换为用户可读性较好的提示。
def division(numerator,denominator):
try:
result=numerator/denominator
return result
except ZeroDivisionError:
return "denominator can not be zero"
except BaseException:
return "pls check if the numerator and denominator is number."
else:
return "unknow error"
ret1=division(1,5)
print(ret1)
ret2=division(1,0)
print(ret2)
1/5正常计算,1/0提示“denominator can not be zero”,这个信息就比较友好,可读性强。
一开始,我在这里犯了一个错误,在try块中没有返回result,程序输出了如下结果
1/5的时候,try块没有发生异常,所以接下来的两个except都不会进入,故就进入到了else处,返回了unknow error,所以我们在使用异常时,一定要记得返回
如果在换一种方式,是否也可以正常返回结果
def division(numerator,denominator):
try:
result=numerator/denominator
except ZeroDivisionError:
result = "denominator can not be zero"
except BaseException:
result = "pls check if the numerator and denominator is number."
else:
result = "unknow error"
return result
ret1=division(1,5)
print(ret1)
ret2=division(1,0)
print(ret2)
结果也和预期不一致,所以在使用异常处理时,如果方法中有返回值,则一定要记得在try块中也返回结果,如果try块中执行正常,异常处理在try执行结束后结束,不再向下执行。
二、JSON 读写数据
JSON(JavaScript Object Notation),最开始只有JavaScript语言使用,但由于其优良的数据格式形式,逐渐被很多编程语言引用,如java中也是用到了JSON,并且有很多对应的类库处理JSON数据。Python中对JSON数据的读取和保存可以使用json.load()和json.dump()方法.
json.dump方法接收两个参数,第一个参数为要保存的json数据,第二个数据为打开的文件对象,使用时注意顺序。
json.load方法接收一个文件对象作为参数
另外json还存在很多其他的方法,比如json.dumps将python数据类型进行json格式编码,可以简单理解为将列表/字典转换为json字符串,json.loads与json.dumps刚好相反,将json字符串转换为列表/字典
如当用户登录后,让其输入名称,然后根据json文件中是否存在该用户给出不同的提示
1、JSON写入
import json
filename="myjson.json"
with open(filename,'w') as wr:
json.dump([1,2,3,4],wr)
2、JSON读取
import json
filename="myjson.json"
with open(filename) as re:
ls=json.load(re)
print(ls)
json读取时,文件必须存在,且不能为空,且内容格式要符合json规范
文件内容为空以及不符合json格式规范,都会出现如下异常
3、使用JSON读取实现一个简单的需求
用户首次登陆,提示欢迎信息,并将其登录信息记录到以SON格式保存到文件中,当该用户下次登录后,将显示欢迎回来,并且提示其上次登录时间。输入quit退出程序
import json
import os
import time
import sys
import traceback
def login():
json_file="./username.json"
while(True):
name=input("pls input your name: ")
if "quit" == name:
sys.exit(0)
curr_time=time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))
user_dict_list=[]
if os.path.exists(json_file):
with open(json_file) as jf:
try:
# 文件内容为空,或者文件内容,或者不符合json格式,所以此处添加异常处理
user_dict_list=json.load(jf)
isExist=False
for ele in user_dict_list:
username=ele.get("username")
if username == name:
isExist=True
ele["lastLoginTime"]=curr_time
print ("welcome back: %s, last login : %s"%(name,curr_time))
break;
if isExist == False:
# 文件存在,且内容格式正确,但不存在当前用户
first_login(user_dict_list,name,curr_time)
except Exception:
# 打印出异常信息,便于调测程序,正式使用事可以去掉,或者打印在后台,不给用户看到
traceback.print_exc()
#文件内容为空,或者文件内容格式不符合JSON要求
first_login(user_dict_list,name,curr_time)
else:
# 文件不存在
first_login(user_dict_list,name,curr_time)
# 将用户信息写入/重新写入到文件中
with open(json_file,'w') as jf:
json.dump(user_dict_list,jf)
''' 将用户第一次登陆信息存放到集合中 '''
def first_login(user_dict_list,name,curr_time):
my_dict={"username":name,"lastLoginTime":curr_time}
user_dict_list.append(my_dict)
print ("welcome: %s, have a nice day."%(name))
login()
输入zhangsan和lisi,由于都是第一次登陆,所以打印出欢迎信息,再次数次zhangsan,由于其已经登录过,故其名称和上次登录时间已经被记录下来,再次登录,打印出欢迎回来,及上次登录时间,输入quit退出程序。由于开发环境已经设置了UTF-8编码,输入中文也是支持的
来源:https://www.cnblogs.com/qq931399960/p/11124480.html
猜你喜欢
- 一直以来都对编译器和解析器有着很大的兴趣,也很清楚一个编译器的概念和整体的框架,但是对于细节部分却不是很了解。我们编写的程序源代码实际上就是
- 实现效果:通过url所绑定的关键名创建目录名,每次访问一个网页url后把文件下载下来代码:其中 data[i][0]、data[i][1]
- 最近关于浏览器的最重要的事情就是IE的极光0day漏洞了,这个漏洞导致包括Google在内的多家美国公司受到黑客的攻击,当然也有很多网站被黑
- pandas基于numpy,所以其中的空值nan和numpy.nan是等价的。numpy中的nan并不是空对象,其实际上是numpy.flo
- 以前我一直用os.system()处理一些系统管理任务,因为我认为那是运行linux命令最简单的方式.我们能从Python官方文档里读到应该
- Tips 1:新增数据表与定义字段更加直观若要建立新数据表,可以在开启数据库后,直接单击“创建”标签,在“表”选项组中单击“表”按钮,即可新
- 搞不清楚在闭包(closures)中Python是怎样绑定变量的看这个例子:>>> def create_multipli
- 本来是要写个程序用的,没写完不写了,这一部分就贴出来吧验证域名和IPclass JianKong(): ''
- QQ医生在广大用户心中一直以来都是清爽便捷的一款安全工具,随着QQ医生的不断发展,QQ医生团队一直在思考,怎样能够给QQ医生用户带来性能更优
- 方法一:直接右键,将文章路径复制下来点击Copy full Xpath使用selenium+lxml中的etree进行配合使用,使用etre
- 从句法上看,协程与生成器类似,都是定义体中包含 yield 关键字的函数。可是,在协程中, yield 通常出现在表达式的右边(例如, da
- 如何剔除HTML标识?这里没有使用正则表达式来去除,当然大家用正则"<.+?>"也可以实现这个功能只留下干净
- 一、两层结构的ASP应用有何缺点 在Browser/Server 应用程序开发领域,微软公司的IIS/ASP以其强大的功能,良好的扩展能力,
- Introduction简介So what is POSH? No, it's not just some new clothing
- 实现效果示例代码import timefrom selenium import webdriverfrom selenium.webdriv
- 用了on error resume next则在这句往后的代码就算出错也会继续执行具体有没有错可以用err.number来判断err.num
- 在python中经常会用到pandas来处理数据,最常用的数据类型是dataframe,但是有时候在dataframe有时间字段需要画时间序
- 无意中看到以前在电脑上保存的一个html页面,关于div水平垂直居中的问题。如何实现div水平垂直居中呢?1.已知宽高度水平垂直居中posi
- 本文介绍使用python+pyqt5开发桌面程序的一个可视化UI视图布局一、环境包的安装1、如果还不知道虚拟环境的可以参考,或者直接使用pi
- 一、绘制折线图使用plot()绘制折线图常用的参数:x:表示x轴的数据y:表示y轴的数据fmt:表示快速设置条样式的格式字符串。label: