- Python 資料持久化教程
- Python 資料持久化 - 首頁
- Python 資料持久化 - 簡介
- Python 資料持久化 - 檔案 API
- 使用 os 模組處理檔案
- Python 資料持久化 - 物件序列化
- Python 資料持久化 - Pickle 模組
- Python 資料持久化 - Marshal 模組
- Python 資料持久化 - Shelve 模組
- Python 資料持久化 - dbm 包
- Python 資料持久化 - CSV 模組
- Python 資料持久化 - JSON 模組
- Python 資料持久化 - XML 解析器
- Python 資料持久化 - Plistlib 模組
- Python 資料持久化 - Sqlite3 模組
- Python 資料持久化 - SQLAlchemy
- Python 資料持久化 - PyMongo 模組
- Python 資料持久化 - Cassandra 驅動程式
- 資料持久化 - ZODB
- 資料持久化 - Openpyxl 模組
- Python 資料持久化資源
- Python 資料持久化 - 快速指南
- Python 資料持久化 - 有用資源
- Python 資料持久化 - 討論
Python 資料持久化 - Pickle 模組
Python 中序列化和反序列化的術語分別為 pickling 和 unpickling。Python 庫中的 pickle 模組使用非常 Python 特定的資料格式。因此,非 Python 應用程式可能無法正確地反序列化 pickled 資料。建議不要從未經身份驗證的來源反序列化資料。
序列化(pickled)的資料可以儲存在位元組字串或二進位制檔案中。此模組定義了 **dumps()** 和 **loads()** 函式,用於使用位元組字串對資料進行 pickle 和 unpickle 操作。對於基於檔案的過程,該模組具有 **dump()** 和 **load()** 函式。
Python 的 pickle 協議是在將 Python 物件構造和解構為/從二進位制資料時使用的約定。目前,pickle 模組定義了 5 種不同的協議,如下所示:
| 序號 | 名稱和描述 |
|---|---|
| 1 |
協議版本 0 原始的“人類可讀”協議,與早期版本相容。 |
| 2 |
協議版本 1 舊的二進位制格式,也與早期版本的 Python 相容。 |
| 3 |
協議版本 2 在 Python 2.3 中引入,提供了對新式類的有效 pickling。 |
| 4 |
協議版本 3 在 Python 3.0 中新增。當需要與其他 Python 3 版本相容時推薦使用。 |
| 5 |
協議版本 4 在 Python 3.4 中新增。它增加了對超大物件的支援。 |
示例
pickle 模組包含 dumps() 函式,該函式返回 pickled 資料的字串表示形式。
from pickle import dump
dct={"name":"Ravi", "age":23, "Gender":"M","marks":75}
dctstring=dumps(dct)
print (dctstring)
輸出
b'\x80\x03}q\x00(X\x04\x00\x00\x00nameq\x01X\x04\x00\x00\x00Raviq\x02X\x03\x00\x00\x00ageq\x03K\x17X\x06\x00\x00\x00Genderq\x04X\x01\x00\x00\x00Mq\x05X\x05\x00\x00\x00marksq\x06KKu.
示例
使用 loads() 函式,對字串進行 unpickle 並獲取原始字典物件。
from pickle import load dct=loads(dctstring) print (dct)
輸出
{'name': 'Ravi', 'age': 23, 'Gender': 'M', 'marks': 75}
pickled 物件也可以使用 dump() 函式持久地儲存在磁碟檔案中,並使用 load() 函式檢索。
import pickle
f=open("data.txt","wb")
dct={"name":"Ravi", "age":23, "Gender":"M","marks":75}
pickle.dump(dct,f)
f.close()
#to read
import pickle
f=open("data.txt","rb")
d=pickle.load(f)
print (d)
f.close()
pickle 模組還提供面向物件的 API,用於以 **Pickler** 和 **Unpickler** 類的形式實現序列化機制。
如上所述,就像 Python 中的內建物件一樣,使用者定義類的物件也可以持久地序列化到磁碟檔案中。在下面的程式中,我們定義了一個 User 類,其例項屬性為姓名和手機號碼。除了 __init__() 建構函式外,該類還覆蓋了 __str__() 方法,該方法返回其物件的字串表示形式。
class User:
def __init__(self,name, mob):
self.name=name
self.mobile=mob
def __str__(self):
return ('Name: {} mobile: {} '. format(self.name, self.mobile))
為了將上述類的物件 pickle 到檔案中,我們使用 pickler 類及其 dump() 方法。
from pickle import Pickler
user1=User('Rajani', 'raj@gmail.com', '1234567890')
file=open('userdata','wb')
Pickler(file).dump(user1)
Pickler(file).dump(user2)
file.close()
相反,Unpickler 類具有 load() 方法來檢索序列化的物件,如下所示:
from pickle import Unpickler
file=open('usersdata','rb')
user1=Unpickler(file).load()
print (user1)