淺談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,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,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,curr_time) else: # 檔案不存在 first_login(user_dict_list,curr_time) # 將使用者資訊寫入/重新寫入到檔案中 with open(json_file,'w') as jf: json.dump(user_dict_list,jf) ''' 將使用者第一次登陸資訊存放到集合中 ''' def first_login(user_dict_list,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讀寫資料的實現就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。