参考:https://blog.csdn.net/coffee_cream/article/details/51754484#
https://blog.csdn.net/ryuhfxz/article/details/82973893
1.先看pickle
pickle是以二进制方式序列化
所有代码在python3.6(win10)上测试。
用于在磁盘上以持久形式存储python数据
(1)文件形式写入和读取,文件打开方式必须是wb和rb
pickle.dump(obj, file, [,protocol])
pickle.load(file)
(2)字符串形式
pickle.dumps(obj[, protocol])
pickle.loads(string)
注:文件形式可以把多个不同的对象存入同一个文件,然后按照保存顺序一次load一个出来
# coding:utf-8
# pickle模块主要函数的应用举例
import pickle
import time
dataList = [[1, 1, 'yes'],
[1, 1, 'yes'],
[1, 0, 'no'],
[0, 1, 'no'],
[0, 1, 'no']]
dataDic = {0: [1, 2, 3, 4],
1: ('a', 'b'),
2: {'c': 'yes', 'd': 'no'}}
start = time.time()
# 使用dump()将数据序列化到文件中
fw = open('dataFile.txt', 'wb')
# Pickle the list using the highest protocol available.
pickle.dump(dataList, fw, -1)
# Pickle dictionary using protocol 0.
pickle.dump(dataDic, fw)
fw.close()
# 使用load()将数据从文件中序列化读出
fr = open('dataFile.txt', 'rb')
data1 = pickle.load(fr)
print(f"data1: {data1}")
data2 = pickle.load(fr)
print(f"data2: {data2}")
fr.close()
# 使用dumps()和loads()举例
p = pickle.dumps(dataList)
print(f"p: {p}")
print(f"dataList: {pickle.loads(p)}")
p = pickle.dumps(dataDic)
print(f"dataDic: {pickle.loads(p)}")
end = time.time()
print(f"time: {end - start}")
输出结果:
data1: [[1, 1, 'yes'], [1, 1, 'yes'], [1, 0, 'no'], [0, 1, 'no'], [0, 1, 'no']]
data2: {0: [1, 2, 3, 4], 1: ('a', 'b'), 2: {'c': 'yes', 'd': 'no'}}
p: b'\x80\x03]q\x00(]q\x01(K\x01K\x01X\x03\x00\x00\x00yesq\x02e]q\x03(K\x01K\x01h\x02e]q\x04(K\x01K\x00X\x02\x00\x00\x00noq\x05e]q\x06(K\x00K\x01h\x05e]q\x07(K\x00K\x01h\x05ee.'
dataList: [[1, 1, 'yes'], [1, 1, 'yes'], [1, 0, 'no'], [0, 1, 'no'], [0, 1, 'no']]
dataDic: {0: [1, 2, 3, 4], 1: ('a', 'b'), 2: {'c': 'yes', 'd': 'no'}}
time: 0.0
注意:1.文件对象要关闭;2.dict对象的keys和values不能够直接pickle,需要转化为list,不然会报类似这样的错误:TypeError: can't pickle odict_values objects;3.torch.save(data, path)其实也是调用pickle进行持久化
2.再看json
json序列化是以字符串的方式保存,具有较好的可读性。语法和pickle大致一样。