物件持久化|序列化
阿新 • • 發佈:2018-12-18
物件持久化
如果要將當前正在計算的資料結果或者狀態永久儲存起,就要用到物件的持久化。
扁平檔案
不建議使用文字檔案來做序列化、持久化儲存
在記憶體裡運算的一些物件或者資料結構,他有一些自己特定的特性、型別,比如列表、字典表等。當我們將它儲存到文字檔案後它將會變成一個純文字,那如果我們再把它反序列化載入到記憶體,還原當前狀態的時,這就有一個型別還原的過程。
寫入文字
scores = [88, 99, 77, 55]
# 將scores儲存到文字檔案裡
def write_scores():
with open('data_list.txt', 'w', encoding='utf8' ) as f:
# 將scores轉換為字串,用write寫入
f.write(str(scores))
print('檔案寫入完成...')
if __name__ == '__main__':
write_scores()
讀取文字
-
在讀取文字的時候如果直接使用
lst=f.read()
來讀取會出現一個型別錯誤TypeError:'str' object does not support item assignment
-
但如果我們用list來轉換型別
lst=list(f.read())
會出現得到的結果是它將所以的字元都拆開了['99', '8', ',', '8',.....]
-
正確做法是使用Python的內建函式**
eval()
**eval()
將傳遞過來的字串轉換為Python表示式
# 讀取文字中的列表
def read_scores():
with open('data_list.txt', 'r', encoding='utf8') as f:
# 使用eval 將字串轉換為表示式
lst = eval(f.read())
lst[0] = 99
print(lst)
if __name__ == '__main__' :
read_scores()
pickle
Python內建模組,可以將我們記憶體中原有型別物件,序列化為字串或者本地的一個檔案
對於單個物件儲存一個檔案較方便,但對於多個物件儲存到一個檔案時,要將它剝離處理比較麻煩
序列化字串
>>>import pickle
>>>person = {'name':'Tom', 'age':20}
>>>s = pickle.dumps(person)
>>>s
b'\x80\x03}q\x00(X\x04\x00\x00\x00nameq\x01X\x03\x00\x00\x00Tomq\x02X\x03\x00\x00\x00ageq\x03K\x14u.'
>>> p = pickle.loads(s)
>>> p
{'name':'Tom', 'age':20}
>>>type(p)
<class 'dict'>
-
.dumps(obj)
:將物件序列化為字串 -
.loads(s)
從字串反序列化物件
序列化物件到檔案
>>>import pickle
>>>person = {'name':'Tom', 'age':20}
>>>pickle.dump(person, open('pickle_db', 'wb'))
>>>p = pickle.load(open('pickle_db','rb'))
>>>p
{'name':'Tom', 'age':20}
>>>type(p)
<class 'dict'>
.dump(obj, file)
將物件序列化為檔案,傳入序列化的物件和寫入的檔案.load(file)
從檔案中反序列化物件
shelve
將多個物件儲存到一個檔案裡,並且可以使用類似於字典表的方式(鍵值的方式)來訪問
shelve序列化
>>> import shelve
>>> scores = [99, 88, 77]
>>> student = {'name':'Mike', 'age':20}
>>> db = shelve.open('shelve_student')
>>> db['s']= student
>>> db['scores']=scores
>>> len(db)
2
>>> temp_student = db['s']
>>> temp_student
{'name': 'Mike', 'age': 20}
>>> type(temp_student)
<class 'dict'>
>>> db['scores']
[99, 88, 77]
>>> del db['scores']
>>> len(db)
1
shelve.open('dbfile')
使用shelve中open方法來構造或開啟資料檔案(二進位制).close()
管不資料檔案db['key']=obj
通過鍵值的方式賦值,將物件序列化到資料檔案len()
檢查數量del db['key']
使用全域性的操作符del,刪除一條物件
shelve序列化自定義例項
自定義一個例項,用shelve序列化(儲存)
import shelve
## 定義類
class Student:
def __init__(self, name, age):
self.name = name
self.age = age
def __str__(self):
return self.name
# 儲存
def write_shelve():
s = Student('Tom', 20) #構造型別的例項
db = shelve.open('shelve_student_db') #構造開啟資料檔案
db['s'] = s
db.close() # 關閉資料檔案
# 讀取
def read_shelve():
db = shelve.open('shelve_student_db') #開啟資料檔案
st = db['s']
print(st)
print(st.name)
print(st.age)
db.close()
if __name__ == '__main__':
write_shelve()
read_shelve()
資料庫
之後單獨記錄
OPRM
之後單獨記錄