存儲數據
程序要將用戶提供的信息儲存在列表和字典等數據結構中。用戶關閉程序時,你幾乎總是要保存他們的信息 一種簡單的方式是使用模塊json來存儲數據
模塊json能將簡單的python數據結構轉儲到文件中,並在程序再次運行時加載該文件中的數據。還可以使用json在python程序之間分享數據,更重要的是,json數據格式並非python專用,這讓你能夠將以json格式儲存的數據與其他編程語言的人分享。
Json 格式最初是由JavaScript開發的,但隨后成了一種常見的格式
使用json.dump()和json.load()
我們來編寫一個存儲一組數字的簡短程序,再編寫一個將這些數字讀取到內存中的程序,第一個程序使用json.dump()來儲存這組數字,第二個程序將使用json.load()
函數json.dump()接受兩個實參:要儲存的數據以及可以用於存儲數據的文件對象。下面是演示
import json number = [1,2,3,5] file_name = 'number.json' #通過擴展名指紋文件存儲的數據為json格式 with open(file_name,'w') as file_object: json.dump(number,file_object)
我們先導入json模塊,再創建一個是數字列表,我們指定存放在number.json里,文件后綴是.json來指出文件存儲的數據是json格式,我們再以寫入模式打開文件,讓json能見數據寫入其中使用json.dup()將數據寫入,我們沒有寫輸出語句,打開這個文件查看,數據存儲的格式與python一樣
注意json.dump()方法,傳遞兩個參數 第一個要寫入的,第二個要存儲的位置
再寫一個程序,使用json.load()讀取到內存中
with open(filename,'r') as file_object: contents = json.load(file_object) print(contents)
這是在程序間共享數據的簡單方式
保存和讀取用戶生成的數據
對於用戶輸入的數據,用json來保存大有裨益,因為如果不以某種方式進行存儲,等程序停止運行時用戶的信息將丟失。 看一個例子
用戶首次運行程序時被提示輸入自己的名字,再次運行程序時就記住他了
我們先儲存名字
ipt = input('enter your name') filename1 = 'name.json' with open(filename1,'w') as file_object: json.dump(ipt, file_object)
再讀取之前存儲的名字
with open(filename1,'r') as file_object: name_ipt = json.load(file_object) print('wleccome %s'%name_ipt)
我們將這兩個程序合並到一個內,在執行的時候先去name.json嘗試獲得用戶名,如果沒有這文件,用try-except處理這個錯誤,並入用戶輸入名字並保存到name.json中
filename1 = 'name.json' try: with open(filename1)as file_object: username = json.load(file_object) except FileNotFoundError: with open(filename1,'w') as file_object2: user_ipt = input('enter your name i will rember you') json.dump(user_ipt,file_object2) else: print(username)
重構
我們經常遇到代碼能運行,但可以進一步的改進 將代碼划分為一些類完成具體工作的函數,這樣的過程稱為重構。 重構讓代碼更清晰更容易理解更容易擴展。
以上代碼主要功能是問候用戶,我們把所有的代碼放到名為greet_user()函數中
def greet_user(): '''問候用戶 並指出其名字''' filename1 = 'name.json' try: with open(filename1)as file_object: username = json.load(file_object) except FileNotFoundError: with open(filename1,'w') as file_object2: user_ipt = input('enter your name i will rember you') json.dump(user_ipt,file_object2) else: print(username)
但是greet_user()不僅問候了用戶,還在儲存了用戶名時獲取他,沒有的時候提示用戶輸入一個,我們將對greet_user()函數重構,讓存儲用戶名的代碼轉移到另一個函數
def get_savename(filename): '''將獲取用戶名沒有返回none''' try: with open(filename) as file_object: sname = json.load(file_object) return sname except FileNotFoundError: return None def get_newname(filename): '''沒有的時候提示玩家輸入並存儲''' with open(filename,'w') as file_object: newname = input('enter you name i will rember you') json.dump(newname,file_object) return newname def geet_username(filename): '''主函數 如果name有讀取,如果沒有輸入''' user_name =get_savename(filename) if user_name: print(user_name) else: newname = get_newname(filename) print(newname) geet_username('name.json')