python 儲存json資料
本篇我們將學習簡單的json資料的儲存,首先我們需要引入json模組:
import json
這裡我們模擬一個常見常見,我們讓使用者輸入使用者名稱、密碼,在密碼輸入完成後提示使用者再次輸入密碼來確認自己的輸入,如果兩次密碼一致,那麼我們將使用者名稱和密碼以json格式寫入檔案,否則提示使用者再次輸入密碼。
name = input("please enter your name:")
password = input("please enter your password:")
confirm_password = input("confirm your password:")
while password != confirm_password:
print("input password inconsistencies,please try again")
password = input("please enter your password:")
confirm_password = input("confirm your password:")
我們執行下程式碼確保我們的準備工作沒有問題:
ok,我們可以通過使用者輸入拿到使用者名稱和密碼,接下來,我們就需要將兩者以json格式存入檔案了。
首先,我們將我們的輸入轉化為json物件:
user_info = json.dumps({'username' : name, 'password': password}, sort_keys=True, indent=4, ensure_ascii=False)
print(user_info)
這裡我們使用了json.dumps函式,該函式 用於將 Python 物件編碼成 JSON 字串。
語法:
def dumps(obj, *, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default =None, sort_keys=False, **kw) Inferred type: (obj: Any, Any, skipkeys: bool, ensure_ascii: bool, check_circular: bool, allow_nan: bool, cls: Any, indent: Any, separators: Any, default: Any, sort_keys: bool, kw: Dict[str, Any]) -> str
其中sort_keys是用來指定在json格式的物件裡面是否按照key的名稱來進行排序,indent引數則指定縮排的空格數目。
最後的輸入格式如下:
{
"password": "us",
"username": "us"
}
那麼接下來我們就將這個json物件寫入到檔案中去:
with open('user_info.json', 'w', encoding='utf-8') as json_file:
json.dump(user_info, json_file, ensure_ascii=False)
print("write json file success!")
這裡我們需要學習一個函式json.dump:
def dump(obj, fp, *, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw) Inferred type: (obj: Any, fp: {write}, Any, skipkeys: bool, ensure_ascii: bool, check_circular: bool, allow_nan: bool, cls: Any, indent: Any, separators: Any, default: Any, sort_keys: bool, kw: Dict[str, Any]) -> None
這個函式有兩個引數是我們必須要填寫的:obj(我們要儲存的資料), fp(檔案控制代碼,也就是我們要存在那個檔案裡面)。
ensure_ascii=False這個引數是處理我們希望在json物件裡面可以包含中文的場景
If ensure_ascii is false, then the strings written to fp can contain non-ASCII characters if they appear in strings contained in obj. Otherwise, all such characters are escaped in JSON strings.
如果不指定ensure_ascii=False,那麼當我們的資料裡面包含中文的時候:
{"username": "zhang\u4e09", "password": "ddd"}
會有如上的顯示內容。
我們執行程式,依次輸入使用者名稱和密碼:
please enter your name:us
please enter your password:us
confirm your password:us
{"username": "us", "password": "us"}
write json file success!
Process finished with exit code 0
然後我們看下文字檔案中的內容:
接下來我們就需要學習一下怎麼讀取json格式的內容了。
with open('user_info.json', 'r', encoding='utf-8') as json_file:
data = json.load(json_file)
print(data)
讀取json資料需要使用json.load函式:
def load(fp, *, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw) Inferred type: (fp: {read}, Any, cls: Any, object_hook: Any, parse_float: Any, parse_int: Any, parse_constant: Any, object_pairs_hook: Any, kw: Dict[str, Any]) -> Any
這裡我們需要提供一個引數fp,也就是我們要操作的檔案控制代碼。
程式執行輸出:
{"username": "us", "password": "us"}
我們可以列印一下json.load返回的是什麼型別的:
print(type(data))
輸出:
<class 'str'>
可見,這是一個字串,這是為什麼呢?難道不應該返回的是python對應的物件嗎?
在上面的程式碼中我們在寫入檔案前面呼叫過:
user_info = json.dumps({'username': name, 'password': password}, ensure_ascii=False)
這一行程式碼,大家還記得吧,它返回的是一個json字串,所以上面的例子中我們需要使用json.loads重新反序列化為python物件,這一點大家留意一下,上面的例子我們是為了給大家演示json.loads的相關用法,使用如下:
data = json.loads(data)
print(type(data))
print(data['username'])
如果沒有這行程式碼,那麼 data = json.load(json_file)返回的就是我們自己組織的資料結構了,如果還是{‘username’: name, ‘password’: password}這種格式,那麼返回就是一個字典物件。
下面我們在通過一個list來看一下:
data = [1,2,3,4,5]
with open('user_info.json', 'w', encoding='utf-8') as json_file:
json.dump(data, json_file, ensure_ascii=False)
with open('user_info.json', 'r', encoding='utf-8') as json_file:
data = json.load(json_file)
print(type(data))
print(data)
執行程式:
<class 'list'>
[1, 2, 3, 4, 5]