序列化:
把不能夠直接存儲的數據變成字節(jié)流(bytes)保存在文件,
進行持久化存儲
反序列化:
把存儲的數據(bytes)轉化成原本的數據類型,
任何數據都可以轉成字節(jié)流(bytes)進行存儲
只有str有encode, decode
其他類型數據需要pickle
1. dumps
把任意對象序列化
li = [1, 2, 4]
res = pickle.dumps(li)
# 返回bytes
print(res, type(res))
2. loads
把字節(jié)流轉換為原本的數據
li1 = pickle.loads(res)
# 轉換回的數據類型為list
print(li1, type(li1))
3. dump(obj, f)
將數據寫入文件
with open('1.txt', 'wb') as f:
li = [1, 2, 4, 5]
# 將li轉換成bytes, 使用f句柄寫入文件, 沒有返回值
pickle.dump(li, f)
4. load(f)
讀取寫入文件中的字節(jié)流數據, 并將其轉換成原本的數據
with open('1.txt', 'rb') as f:
res = pickle.load(f)
# 讀取f中寫入的數據對象, 將bytes轉換成原本的數據類型
print(res, type(res))
序列化迭代器
iter1 = iter(range(5))
res = pickle.dumps(iter1)
iter2 = pickle.loads(res)
print(iter2, type(iter2))
多數據對象使用pickle寫入文件
li = [1, 2, 4, 5]
tup = (1, 2, 4, 5)
dic = {1:2, 2:3, 4:3}
s = 'abc'
setvar = {1, 2, 4}
with open('2.txt', 'wb') as f:
pickle.dump(li, f)
pickle.dump(tup, f)
pickle.dump(setvar, f)
pickle.dump(dic, f)
pickle.dump(s, f)
with open('2.txt', 'rb') as f:
# f也是一個迭代器,
# load相當于next, 不斷調用f
# 返回反序列化后的數據
for i in range(5):
res = pickle.load(f)
print(res, type(res))