1. 程式人生 > >【Python】存儲數據

【Python】存儲數據

之間 多任務 rda 運行 接下來 調用函數 生成 代碼塊 使用

很多程序都要求用戶輸入某種信息,如讓用戶存儲遊戲首選項或者提供可視化數據,不管專註什麽,程序都要將數據進行存儲,那麽如何存儲呢?

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】存儲數據