【Python】存儲數據
很多程序都要求用戶輸入某種信息,如讓用戶存儲遊戲首選項或者提供可視化數據,不管專註什麽,程序都要將數據進行存儲,那麽如何存儲呢?
JSON(JavaScript Object Notation)格式最初是為JavaScript開發的,但隨後成了一種常見格式,被包括Python在內的眾多語言采用
使用json.dump()和json.loan()
1.josn.dump()存儲數據
語法:json.dump(存儲數據,文件名)
import json numbers = [1,2,3,4,5,6] file_name = ‘TestDump.json‘ with open(file_name,‘w‘) as file_obj: json.dump(numbers,file_obj)
我們可以在文件夾中看到文件
2.json.laod()讀取數據
語法:json.load(文件名)
下面是我們讀取數據文件TestDump.json內容的程序
import json file_name = ‘TestDump.json‘ with open(file_name) as file_obj: numbers = json.load(file_obj) print(numbers)
這是一種在程序之間共享數據的簡單方式
保存和讀取用戶生成的數據
對於用戶生成的數據,使用json保存他們大有裨益,因為如果不以某種方式進行存儲,等程序停止運行時用戶的數據將會丟失。
import json username = input("what is your name?") filename = ‘username.json‘ with open(filename,‘w‘) as file_obj: json.dump(username,file_obj) print("we will remeber when you come back," + username+"!")
運行結果:
我們提示輸入用戶名,並將其存儲在一個變量中,接下來,我們又調用json.dump(),並將用戶名和一個文件對象傳遞給他,從而將用戶名存儲在文件中。
我們在編寫一個程序,向其名字被存儲的用戶發出問候
import json file_name = ‘username.json‘ with open(file_name) as f_obj: username = json.load(f_obj) print("Welcome back,"+username+"!")
運行結果:
我們將兩個程序合並到一個程序中。在這個程序運行時,我們將嘗試從文件username.json中獲取用戶名,因此我們首先編寫一個嘗試恢復用戶名的try代碼塊。當文件不存在的時候,我們就在except中提示輸入用戶名,並將其存儲到username.json文件中,以便程序再次運行時獲取它。
import json #如果以前存儲了用戶名,就加載它,否則,就提示用戶輸入用戶名 file_name = ‘username.json‘ try: with open(file_name) as f_obj: username = json.load(f_obj) except FileNotFoundError: username = input("what is your name?") with open(file_name,‘w‘) as f_obj: json.dump(username,f_obj) print("we‘ll remeber you when you come back,"+username+"!") else: print("Welcome back,"+username+"!")
這個程序首次運行輸出如下:
否則,輸出如下:
重構
你經常會遇到這樣的情況:代碼能夠正確運行,但可做進一步的改進,將代碼劃分為一系列完成具體工作的函數,這個過程稱為重構
import json def greet_user(): ‘‘‘問候用戶,並指出其名字‘‘‘ file_name = ‘username.json‘ try: with open(file_name) as f_obj: username = json.load(f_obj) except FileNotFoundError: username = input("what is your name?") with open(file_name,‘w‘) as f_obj: json.dump(username,f_obj) print("we‘ll remeber you when you come back,"+username+"!") else: print("Welcome back,"+username+"!") #調用函數 greet_user()
或許有人覺得,上面的程序執行的任務太多了,我們不想它執行那麽多任務,我們首先將獲取存儲的用戶名的代碼移到另外一個函數中:
【提取存在文件時執行操作】
import json def get_stored_username(): ‘‘‘如果存儲了用戶名,就獲取它‘‘‘ file_name = ‘username.json‘ try: with open(file_name) as f_obj: username = json.load(f_obj) except FileNotFoundError: return None else: return username def greet_user(): ‘‘‘問候用戶,並指出其名字‘‘‘ username = get_stored_username() if username: print("Welcome back," + username + "!") else: username = input("what is your name?") file_name = ‘username.json‘ with open(file_name, ‘w‘) as f_obj: json.dump(username, f_obj) print("we‘ll remeber you when you come back," + username + "!") #調用函數 greet_user()
新增的函數get_stored_username()目標很明確,如果文件存儲了用戶名,這個函數就獲取並返回它,如果文件不存在,這個函數就返回None,這是一種不錯的方法:函數要麽返回預期的值,要麽返回None.
【提取沒有存儲用戶名時提示用戶輸入的操作】
上面的程序還可以繼續優化,將greet_user()中的另外一塊代碼提取出來:將沒有存儲用戶名時提示用戶輸入的代碼放在一個獨立的函數中
import json def get_stored_username(): ‘‘‘如果存儲了用戶名,就獲取它‘‘‘ file_name = ‘username.json‘ try: with open(file_name) as f_obj: username = json.load(f_obj) except FileNotFoundError: return None else: return username def get_new_username(): ‘‘‘提示用戶輸入用戶名‘‘‘ username = input("what is your name?") file_name = ‘username.json‘ with open(file_name,‘w‘) as f_obj: json.dump(username,f_obj) return username def greet_user(): ‘‘‘問候用戶,並指出其名字‘‘‘ username = get_stored_username() if username: print("Welcome back," + username + "!") else: username = get_new_username() print("we‘ll remeber you when you come back," + username + "!") #調用函數 greet_user()
這個版本是最終版本了,每個函數都執行單一而清晰的任務。
【Python】存儲數據