Python數(shù)據(jù)序列化和固化存儲(chǔ)的方式
數(shù)據(jù)序列化就是把內(nèi)存中的數(shù)據(jù)結(jié)構(gòu)(如列表、字典、對(duì)象) 轉(zhuǎn)換成可以存儲(chǔ)(如寫入文件)或傳輸(如網(wǎng)絡(luò)發(fā)送)的格式;反序列化則是把這個(gè)格式還原回原來的數(shù)據(jù)結(jié)構(gòu)。
在python中常見的序列化方式有:JSON、pickle
JSON 序列化
JSON 是跨語言的輕量級(jí)格式,適合和其他語言(如 Java、JavaScript)交互,但僅支持 Python 的基礎(chǔ)數(shù)據(jù)類型:str、int、float、list、dict、bool、None。
核心函數(shù)
json.dumps():把數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)換成 JSON 字符串(內(nèi)存中)json.dump():把數(shù)據(jù)結(jié)構(gòu)直接寫入文件(序列化到文件)json.loads():把 JSON 字符串還原成 Python 數(shù)據(jù)結(jié)構(gòu)(反序列化)json.load():從文件讀取 JSON 并還原(反序列化)
json.dumps()
import json
d1 = {'name':'Tomdeng','age':18}
# dict --> json
d1_str = json.dumps(d1)
print(d1) # {'name': 'Tomdeng', 'age': 18}
print(d1_str) # {"name": "Tomdeng", "age": 18}
print(type(d1_str)) <class 'str'>json.dump()
import json
d1 = {'name':'Tomdeng','age':18}
f = open("json_test.txt","w+")
json.dump(d1,f)
f.seek(0)
print(f.read()) # {"name": "Tomdeng", "age": 18}
f.close()json.loads()
import json
d1_str = '{"name":"Tomdeng","age":18}'
d1 = json.loads(d1_str)
print(d1_str) # {"name":"Tomdeng","age":18}
print(d1) # {'name': 'Tomdeng', 'age': 18}
print(type(d1)) # <class 'dict'>json.load()
import json
f = open("json_test.txt","r")
d1 = json.load(f)
print(d1) # {'name': 'Tomdeng', 'age': 18}
print(type(d1)) # <class 'dict'>
f.close()
注意:
JSON的鍵必須是字符串,Python 字典的非字符串鍵會(huì)被自動(dòng)轉(zhuǎn)成字符串;- 不支持 Python 的自定義對(duì)象、
tuple(會(huì)被轉(zhuǎn)成列表)、set等類型。
pickle 序列化
pickle 是 Python 特有的序列化方式,支持所有 Python 數(shù)據(jù)類型(包括自定義對(duì)象、函數(shù)、類),但無法跨語言使用,且序列化后的是二進(jìn)制數(shù)據(jù)。
核心函數(shù)
pickle.dumps():轉(zhuǎn)成二進(jìn)制字符串pickle.dump():寫入文件(二進(jìn)制模式)pickle.loads():還原二進(jìn)制字符串pickle.load():從二進(jìn)制文件還原
pickle.dumps()
import pickle
d1 = {'name':'Tomdeng','age':18}
d1_binary = pickle.dumps(d1)
print(type(d1_binary))
pickle.dump()
import pickle
d1 = {'name':'Tomdeng','age':18}
f = open("pickle_test","wb")
pickle.dump(d1,f)
f.close()
pickle.loads()
import pickle
d1 = {'name':'Tomdeng','age':18}
d1_binary = pickle.dumps(d1)
d2 = pickle.loads(d1_binary)
print(d2) # {'name': 'Tomdeng', 'age': 18}
print(type(d2)) # <class 'dict'>
pickle.load()
import pickle
f= open("pickle_test","rb")
d1 = pickle.load(f)
print(d1) # {'name': 'Tomdeng', 'age': 18}
print(type(d1)) # <class 'dict'>
固化存儲(chǔ)
通過open("file_name","type")來對(duì)文件進(jìn)行操作,將內(nèi)存中的數(shù)據(jù)保存在磁盤中(內(nèi)存中的數(shù)據(jù)當(dāng)程序結(jié)束或主機(jī)關(guān)閉時(shí)將被釋放)
同時(shí)可以通過encoding字符集
參數(shù)
- r 只讀
- w 覆蓋寫
- a 追加寫
r+ / w+ /a+ 的區(qū)別
| 模式 | 文件不存在 | 文件已存在 | 初始指針位置 | 寫入行為 | 關(guān)鍵特點(diǎn) |
|---|---|---|---|---|---|
r+ | 報(bào)錯(cuò) | 保留原有內(nèi)容 | 文件開頭 | 覆蓋指針位置的內(nèi)容 | 適合「讀取 + 修改」已有文件,不會(huì)清空原內(nèi)容 |
w+ | 創(chuàng)建新文件 | 清空原有內(nèi)容 | 文件開頭 | 從開頭寫入(覆蓋) | 適合「先寫后讀」,但會(huì)清空原文件 |
a+ | 創(chuàng)建新文件 | 保留原有內(nèi)容 | 文件末尾 | 始終追加到末尾 | 適合「讀取 + 追加」,寫入不會(huì)覆蓋原有內(nèi)容 |
默認(rèn)r/w/a后面有一個(gè)文本類型為t(普通文本),如果需要操作的文件是二進(jìn)制文本,要在后面添加b,如“rb”
相關(guān)方法
# fp.read(5) 按照字節(jié)數(shù)開始讀 讀和寫都是在文件指針后開始讀寫
# fp.seek(0) 重置光標(biāo)位置為開頭
# fp.readline() 從光標(biāo)的位置讀到行尾
# fp.readlines() 默認(rèn)從光標(biāo)位置讀到文件末尾,按行存放到列表中
# fp.readlines(4) 讀取到累計(jì)字符數(shù) > 4的行
# for i in fp:
print("一行一行讀",i )
# fp.close() 關(guān)閉打開的文件,釋放資源
注意:
with open(…) as f:是文件操作的最優(yōu)寫法,自動(dòng)關(guān)閉文件句柄,無需手動(dòng)調(diào)用f.close()
實(shí)例
with open("user.txt","r+",encoding="utf-8") as f:
print(f.readlines())
輸出
['{"tom": {"username": "tom", "password": "123456", "age": "20", "sex": "man"}}']
練習(xí)
登錄系統(tǒng)
1.注冊(cè) 輸入賬號(hào)和密碼 年齡,性別
判斷是否存在
2.登錄 輸入賬號(hào)和密碼
判斷賬戶是否存在,密碼是否正確
3.退出解題:
import json
fr = open("user.txt","r")
str = fr.read()
fr.close()
if str != "" :
d1 = json.loads(str)
else:
d1 = dict()
while True:
choice = input("1.注冊(cè)\t2.登錄\t3.退出\n")
match choice:
case "1":
username,password,age,sex = input("請(qǐng)輸入用戶名,密碼,年齡,性別\n").split()
if username in d1:
print("用戶已存在")
else:
d1[username] = {"username":username,"password":password,"age":age,"sex":sex}
case "2":
username,password = input("請(qǐng)輸入用戶名和密碼\n").split()
if username not in d1:
print("用戶不存在\n")
elif d1[username]["password"] != password:
print("密碼錯(cuò)誤\n")
else:
print("登錄成功")
case "3":
str1 = json.dumps(d1)
fw = open("user.txt", "w")
fw.write(str1)
fw.close()
print("退出成功")
break到此這篇關(guān)于Python數(shù)據(jù)序列化和固化存儲(chǔ)的方式的文章就介紹到這了,更多相關(guān)python數(shù)據(jù)序列化和固化存儲(chǔ)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python?(pyqt)?表格顯示圖片的實(shí)現(xiàn)方式
這篇文章主要介紹了python?(pyqt)?表格顯示圖片的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09
解決Jupyter Notebook使用parser.parse_args出現(xiàn)錯(cuò)誤問題
這篇文章主要介紹了解決Jupyter Notebook使用parser.parse_args出現(xiàn)錯(cuò)誤問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-04-04
使用Python?Seaborn創(chuàng)建熱力圖的制作指南
熱力圖作為一種直觀的數(shù)據(jù)可視化工具,通過顏色深淺和漸變映射數(shù)據(jù)值,廣泛應(yīng)用于數(shù)據(jù)密度分析、趨勢(shì)挖掘和跨維度對(duì)比,本文將結(jié)合Python的seaborn庫,從熱力圖的核心原理到實(shí)際操作案例,逐步講解如何利用熱力圖揭示數(shù)據(jù)背后的隱藏規(guī)律,需要的朋友可以參考下2025-08-08
基于Python實(shí)現(xiàn)一個(gè)簡(jiǎn)單的注冊(cè)機(jī)并生成卡密
這篇文章主要為大家詳細(xì)介紹了如何使用Python編寫一個(gè)簡(jiǎn)單而強(qiáng)大的注冊(cè)機(jī),生成卡密來實(shí)現(xiàn)用戶注冊(cè),從而輕松登錄應(yīng)用程序,有需要的小伙伴快可以參考下2023-12-12
Python借助 Spire.PDF for Python提取PDF圖片的終極指南
PDF 文件中的圖片往往蘊(yùn)藏著重要的信息,但提取它們的過程卻可能頗具挑戰(zhàn)性,本文將借助 Spire.PDF for Python高效地從 PDF 文檔中提取所需的圖片,感興趣的可以了解下2026-01-01

