淺談Python中的異常和JSON讀寫數(shù)據(jù)的實(shí)現(xiàn)
異常可以防止出現(xiàn)一些不友好的信息返回給用戶,有助于提升程序的可用性,在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執(zhí)行正常,輸出0.2,但1/0,分母為0,拋出Traceback,該信息看起來非常不友好,try .. except可以獲取這些異常信息,并且允許轉(zhuǎn)換為用戶可讀性較好的提示。
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正常計(jì)算,1/0提示“denominator can not be zero”,這個(gè)信息就比較友好,可讀性強(qiáng)。
一開始,我在這里犯了一個(gè)錯(cuò)誤,在try塊中沒有返回result,程序輸出了如下結(jié)果
1/5的時(shí)候,try塊沒有發(fā)生異常,所以接下來的兩個(gè)except都不會進(jìn)入,故就進(jìn)入到了else處,返回了unknow error,所以我們在使用異常時(shí),一定要記得返回

如果在換一種方式,是否也可以正常返回結(jié)果
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)

結(jié)果也和預(yù)期不一致,所以在使用異常處理時(shí),如果方法中有返回值,則一定要記得在try塊中也返回結(jié)果,如果try塊中執(zhí)行正常,異常處理在try執(zhí)行結(jié)束后結(jié)束,不再向下執(zhí)行。
二、JSON 讀寫數(shù)據(jù)
JSON(JavaScript Object Notation),最開始只有JavaScript語言使用,但由于其優(yōu)良的數(shù)據(jù)格式形式,逐漸被很多編程語言引用,如java中也是用到了JSON,并且有很多對應(yīng)的類庫處理JSON數(shù)據(jù)。Python中對JSON數(shù)據(jù)的讀取和保存可以使用json.load()和json.dump()方法.
json.dump方法接收兩個(gè)參數(shù),第一個(gè)參數(shù)為要保存的json數(shù)據(jù),第二個(gè)數(shù)據(jù)為打開的文件對象,使用時(shí)注意順序。
json.load方法接收一個(gè)文件對象作為參數(shù)
另外json還存在很多其他的方法,比如json.dumps將python數(shù)據(jù)類型進(jìn)行json格式編碼,可以簡單理解為將列表/字典轉(zhuǎn)換為json字符串,json.loads與json.dumps剛好相反,將json字符串轉(zhuǎn)換為列表/字典
如當(dāng)用戶登錄后,讓其輸入名稱,然后根據(jù)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讀取時(shí),文件必須存在,且不能為空,且內(nèi)容格式要符合json規(guī)范
文件內(nèi)容為空以及不符合json格式規(guī)范,都會出現(xiàn)如下異常

3、使用JSON讀取實(shí)現(xiàn)一個(gè)簡單的需求
用戶首次登陸,提示歡迎信息,并將其登錄信息記錄到以SON格式保存到文件中,當(dāng)該用戶下次登錄后,將顯示歡迎回來,并且提示其上次登錄時(shí)間。輸入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:
# 文件內(nèi)容為空,或者文件內(nèi)容,或者不符合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:
# 文件存在,且內(nèi)容格式正確,但不存在當(dāng)前用戶
first_login(user_dict_list,name,curr_time)
except Exception:
# 打印出異常信息,便于調(diào)測程序,正式使用事可以去掉,或者打印在后臺,不給用戶看到
traceback.print_exc()
#文件內(nèi)容為空,或者文件內(nèi)容格式不符合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,由于都是第一次登陸,所以打印出歡迎信息,再次數(shù)次zhangsan,由于其已經(jīng)登錄過,故其名稱和上次登錄時(shí)間已經(jīng)被記錄下來,再次登錄,打印出歡迎回來,及上次登錄時(shí)間,輸入quit退出程序。由于開發(fā)環(huán)境已經(jīng)設(shè)置了UTF-8編碼,輸入中文也是支持的
以上這篇淺談Python中的異常和JSON讀寫數(shù)據(jù)的實(shí)現(xiàn)就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
在Django下創(chuàng)建項(xiàng)目以及設(shè)置settings.py教程
今天小編就為大家分享一篇在Django下創(chuàng)建項(xiàng)目以及設(shè)置settings.py教程,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-12-12
Python生成器next方法和send方法區(qū)別詳解
這篇文章主要介紹了Python生成器next方法和send方法區(qū)別詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05
Django中反向生成models.py的實(shí)例講解
今天小編就為大家分享一篇Django中反向生成models.py的實(shí)例講解,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-05-05
用Python 爬取貓眼電影數(shù)據(jù)分析《無名之輩》
這篇文章主要介紹了用Python 爬取貓眼電影數(shù)據(jù)分析《無名之輩》,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07
Python數(shù)據(jù)分析:手把手教你用Pandas生成可視化圖表的教程
今天小編就為大家分享一篇Python數(shù)據(jù)分析:手把手教你用Pandas生成可視化圖表的教程,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-12-12
如何輕松實(shí)現(xiàn)Python數(shù)組降維?
歡迎來到Python數(shù)組降維實(shí)現(xiàn)方法的指南!這里,你將探索一種神秘又強(qiáng)大的編程技術(shù),想要提升你的Python編程技巧嗎?別猶豫,跟我一起深入探索吧!2024-01-01
python解析mdf或mf4文件利器之a(chǎn)sammdf用法
這篇文章主要介紹了python解析mdf或mf4文件利器之a(chǎn)sammdf用法,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-06-06

