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

参考:Python数据存储:pickle模块的使用讲解_coffee_cream的博客-CSDN博客

python的序列化和反序列化pickle和json_ryuhfxz的博客-CSDN博客

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

https://www.cnblogs.com/momoyan/p/9145478.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值