1. 程式人生 > >物件持久化|序列化

物件持久化|序列化

物件持久化

如果要將當前正在計算的資料結果或者狀態永久儲存起,就要用到物件的持久化。

扁平檔案

不建議使用文字檔案來做序列化、持久化儲存

在記憶體裡運算的一些物件或者資料結構,他有一些自己特定的特性、型別,比如列表、字典表等。當我們將它儲存到文字檔案後它將會變成一個純文字,那如果我們再把它反序列化載入到記憶體,還原當前狀態的時,這就有一個型別還原的過程。

寫入文字

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',.....]

    (因為list轉換把每一個字元(包括符號)都轉換為列表物件了)

  • 正確做法是使用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

之後單獨記錄