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

异常可以防止出现一些不友好的信息返回给用户,有助于提升程序的可用性,在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编码,输入中文也是支持的

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

(0)

相关推荐

  • Python实现的读写json文件功能示例

    本文实例讲述了Python实现的读写json文件功能.分享给大家供大家参考,具体如下: 相比java,python对json文件的处理就简单很多.java操作json文件的话需要引用jar包及相关依赖包,想用java操作json的同学可以去百度,这里就不赘述了. 首先说读json文件 在进行json操作之前,首先要了解json的格式,分辨json文件. json文件格式一般有两种: 第一种:每行一个json类似于以下这种形式: ["name":"Tony",&quo

  • Python JSON格式数据的提取和保存的实现

    环境:python-3.6.5 JSON JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,它使得人们很容易的进行阅读和编写.同时也方便了机器进行解析和生成.适用于进行数据交互的场景,比如网站前台与后台之间的数据交互. Python中自带了json模块,直接import json即可使用 官方文档:https://docs.python.org/3/library/json.html Json在线解析网站:https://www.json.cn/# j

  • python如何读写json数据

    本文实例为大家分享了python读写json数据的具体代码,供大家参考,具体内容如下 案例: 在web应用中常常用到json数据进行传输数据,本质上是字典类型数据转换成字符串,通过字符串进行网页传输,然后把接收到的字符串转换成字典类似数据 需求:实现字典转换成字符串,字符串转换成字典数据类型,写入文件 如何做? 1.明确dumps和dump的区别,dump的接口是文件,直接写入文件,dumps把对应的数据类型转换成字符串,loads 和dumps相反,load直接从文件中读取文件并把数据转换成对

  • python读写json文件的简单实现

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于ECMAScript的一个子集. JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C.C++.Java.JavaScript.Perl.Python等).这些特性使JSON成为理想的数据交换语言.易于人阅读和编写,同时也易于机器解析和生成(一般用于提升网络传输速率). JSON在python中分别由list和dict组成. 这是用于序列化的两个模块: json: 用于

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

    异常可以防止出现一些不友好的信息返回给用户,有助于提升程序的可用性,在java中通过try ... catch ... finally来处理异常,在Python中通过try ... except ... else来处理异常 一.以ZeroDivisionError为例,处理分母为0的除法异常 def division(numerator,denominator): result=numerator/denominator return result ret1=division(1,5) prin

  • 浅谈python中对于json写入txt文件的编码问题

    最近一直在研究python+selenium+beautifulsoup的爬虫,但是存入数据库还有写入txt文件里面的时候一直都是unicode编码的格式. 接下来就是各种翻阅文档,查找谷歌和度娘,但是都没有具体的说明是什么问题. 结果根据自己的代码发现,原来是一句代码写到后面去了. name = json.dumps('中国你好', ensure_ascii=False) #重点就是这一句代码 date = time.strftime('%Y-%m-%d', time.localtime(ti

  • 浅谈python中的错误与异常

    目录 一.语法错误 二.异常处理 2.1.try-finally语句 2.2.raise 语句 2.3.assert 断言语句 三.小结 一.语法错误 异常:大多数的异常都不会被程序处理,都以错误信息的形式展现在这里 二.异常处理 while True: try: x = int(input("请输入一个错误:")) break except ValueError: print("不是有效数字,再试一遍") try 语句执行顺序: 先执行try语句里面的语句,如果没

  • 浅谈python中的面向对象和类的基本语法

    当我发现要写python的面向对象的时候,我是踌躇满面,坐立不安呀.我一直在想:这个坑应该怎么爬?因为python中关于面向对象的内容很多,如果要讲透,最好是用面向对象的思想重新学一遍前面的内容.这个坑是如此之大,犹豫再三,还是只捡一下重要的内容来讲吧,不足的内容只能靠大家自己去补充了. 惯例声明一下,我使用的版本是 python2.7,版本之间可能存在差异. 好,在开讲之前,我们先思考一个问题,看代码: 为什么我只创建是为 a 赋值,就可以使用一些我没写过的方法? 可能会有小伙伴说:因为 a

  • 浅谈python中的getattr函数 hasattr函数

    hasattr(object, name) 作用:判断对象object是否包含名为name的特性(hasattr是通过调用getattr(ojbect, name)是否抛出异常来实现的). 示例: >>> hasattr(list, 'append') True >>> hasattr(list, 'add') False getattr(object,name,default): 作用:返回object的名称为name的属性的属性值,如果属性name存在,则直接返回其

  • 浅谈Python中os模块及shutil模块的常规操作

    如下所示: #os.listdir() 方法用于返回指定的文件夹包含的文件或文件夹的名字的列表.这个列表以字母顺序. 它不包括 '.' 和'..' 即使它在文件夹中. #只支持在 Unix, Windows 下使用 import os, sys # 打开文件 path=r'C:\Users\Administrator.SKY-20180518VHY\Desktop\rx\ore' dirs = os.listdir( path ) print(dirs) # 输出所有文件和文件夹 for fil

  • 浅谈Python中文件夹和python package包的区别

    pycharm右键新建时会有目录(文件夹)和python package两个选项,这两个到底有什么不同呢 1.原来在python模块的每一个包中,都有一个__init__.py文件(这个文件定义了包的属性和方法)然后是一些模块文件和子目录,假如子目录中也有__init__.py那么它就是这个包的子包了. 当你将一个包作为模块导入(比如从 xml导入 dom)的时候,实际上导入了它的__init__.py 文件. 2.而目录跟包唯一不同的就是没有__init__.py 文件,一个包是一个带有特殊文

  • 浅谈Python中的生成器和迭代器

    迭代器 迭代器协议 对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么返回一个异常来终止本次迭代.(只能往前走,不能往后退!) 迭代器对象 遵循了(实现了)迭代器协议的对象.(对象内部实现了一个__next__方法,以实现迭代器协议)称为一个迭代器对象.他们的作用是逐个遍历容器中的对象.迭代器对象一定是可迭代对象 >>> from collections import Iterable, Iterator >>> l = list([1,2,3]) #

  • 浅谈Python中的常用内置对象

    一.常用的python内置对象 对象类型 类型名称 示例 简要说明 数字 int,float,complex 1234,3.14,3+4j 数字大小没有限制,内置支持复数及其运算 字符串 str 'swfu' 使用单引号.双引号.三引号作为定界符,以r/R引导表示原始字符串 字节串 bytes b'hello world' 以字母b引导,可以使用单引号.双引号.三引号作为定界符 列表 list [1,2,3] 所有元素放在[ ]中,元素之向使用","分隔,其中的元素可以是任意类型 字典

  • 浅谈Python中对象是如何被调用的

    目录 楔子 从 Python 的角度看对象的调用 从解释器的角度看对象的调用 小结 楔子 我们知道对象是如何被创建的,主要有两种方式,一种是通过Python/C API,另一种是通过调用类型对象.对于内置类型的实例对象而言,这两种方式都是支持的,比如列表,我们即可以通过[]创建,也可以通过list(),前者是Python/C API,后者是调用类型对象. 但对于自定义类的实例对象而言,我们只能通过调用类型对象的方式来创建.而一个对象如果可以被调用,那么这个对象就是callable,否则就不是ca

随机推荐