python中的序列化和反序列化pickle和json

参考: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大致一样。

 

你可能感兴趣的:(pickle,python)