浅谈Python中的异常和JSON读写数据的实现


Posted in Python onFebruary 27, 2020

异常可以防止出现一些不友好的信息返回给用户,有助于提升程序的可用性,在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)

浅谈Python中的异常和JSON读写数据的实现

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)

浅谈Python中的异常和JSON读写数据的实现

1/5正常计算,1/0提示“denominator can not be zero”,这个信息就比较友好,可读性强。

一开始,我在这里犯了一个错误,在try块中没有返回result,程序输出了如下结果

1/5的时候,try块没有发生异常,所以接下来的两个except都不会进入,故就进入到了else处,返回了unknow error,所以我们在使用异常时,一定要记得返回

浅谈Python中的异常和JSON读写数据的实现

如果在换一种方式,是否也可以正常返回结果

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)

浅谈Python中的异常和JSON读写数据的实现

结果也和预期不一致,所以在使用异常处理时,如果方法中有返回值,则一定要记得在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格式规范,都会出现如下异常

浅谈Python中的异常和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()

浅谈Python中的异常和JSON读写数据的实现

输入zhangsan和lisi,由于都是第一次登陆,所以打印出欢迎信息,再次数次zhangsan,由于其已经登录过,故其名称和上次登录时间已经被记录下来,再次登录,打印出欢迎回来,及上次登录时间,输入quit退出程序。由于开发环境已经设置了UTF-8编码,输入中文也是支持的

以上这篇浅谈Python中的异常和JSON读写数据的实现就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python抓取某汽车网数据解析html存入excel示例
Dec 04 Python
python通过ftplib登录到ftp服务器的方法
May 08 Python
python进程管理工具supervisor的安装与使用教程
Sep 05 Python
对python 各种删除文件失败的处理方式分享
Apr 24 Python
python设置值及NaN值处理方法
Jul 03 Python
解决Python print输出不换行没空格的问题
Nov 14 Python
python实现三次样条插值
Dec 17 Python
python给图像加上mask,并提取mask区域实例
Jan 19 Python
python给视频添加背景音乐并改变音量的具体方法
Jul 19 Python
Python三维绘图之Matplotlib库的使用方法
Sep 20 Python
python如何实现word批量转HTML
Sep 30 Python
python 根据列表批量下载网易云音乐的免费音乐
Dec 03 Python
简单了解Python write writelines区别
Feb 27 #Python
python json load json 数据后出现乱序的解决方案
Feb 27 #Python
Python3标准库之functools管理函数的工具详解
Feb 27 #Python
Python打包工具PyInstaller的安装与pycharm配置支持PyInstaller详细方法
Feb 27 #Python
python通过对字典的排序,对json字段进行排序的实例
Feb 27 #Python
python实现翻译word表格小程序
Feb 27 #Python
Python统计文本词汇出现次数的实例代码
Feb 27 #Python
You might like
使用php来实现网络服务
2009/09/15 PHP
php float不四舍五入截取浮点型字符串方法总结
2013/10/28 PHP
php上传中文文件名乱码问题处理方案
2015/02/03 PHP
Mac环境下php操作mysql数据库的方法分享
2015/05/11 PHP
JQuery的Ajax跨域请求原理概述及实例
2013/04/26 Javascript
JavaScript分秒倒计时器实现方法
2015/02/02 Javascript
javascript中window.open在原来的窗口中打开新的窗口(不同名)
2015/11/15 Javascript
javascript超过容器后显示省略号效果的方法(兼容一行或者多行)
2016/07/14 Javascript
很棒的js选项卡切换效果
2016/07/15 Javascript
BootStrap入门教程(三)之响应式原理
2016/09/19 Javascript
详解Vue2.0 事件派发与接收
2017/09/05 Javascript
Vue实现微信支付功能遇到的坑
2019/06/05 Javascript
原生js实现俄罗斯方块
2020/10/20 Javascript
[01:02:09]Liquid vs TNC 2019国际邀请赛淘汰赛 胜者组 BO3 第二场 8.21
2020/07/19 DOTA
[01:42:49]DOTA2-DPC中国联赛 正赛 iG vs PSG.LGD BO3 第一场 2月26日
2021/03/11 DOTA
pygame学习笔记(3):运动速率、时间、事件、文字
2015/04/15 Python
使用Python脚本将Bing的每日图片作为桌面的教程
2015/05/04 Python
python 默认参数问题的陷阱
2016/02/29 Python
关于Python数据结构中字典的心得
2017/12/04 Python
Python使用matplotlib绘制正弦和余弦曲线的方法示例
2018/01/06 Python
python实现12306抢票及自动邮件发送提醒付款功能
2018/03/08 Python
10 分钟快速入门 Python3的教程
2019/01/29 Python
Python常用模块之requests模块用法分析
2019/05/15 Python
pandas DataFrame索引行列的实现
2019/06/04 Python
python使用原始套接字发送二层包(链路层帧)的方法
2019/07/22 Python
python装饰器使用实例详解
2019/12/14 Python
Python 窗体(tkinter)下拉列表框(Combobox)实例
2020/03/04 Python
使用jupyter notebook将文件保存为Markdown,HTML等文件格式
2020/04/14 Python
python定时截屏实现
2020/11/02 Python
详解CSS3中nth-child与nth-of-type的区别
2017/01/05 HTML / CSS
澳大利亚免息网上购物:Shop Zero
2016/09/17 全球购物
草莓网美国官网:Strawberrynet USA
2016/12/11 全球购物
十佳美德少年事迹材料
2014/02/05 职场文书
机械工程及自动化专业求职信
2014/09/03 职场文书
软环境建设心得体会
2014/09/09 职场文书
2014年第四季度入党积极分子思想汇报(十八届四中全会)
2014/11/03 职场文书