专栏首页python3python Json与pickle数据序列化

python Json与pickle数据序列化

在程序运行的过程中,所有的变量都是在内存中。一旦程序结束,变量所占用的内存就被操作系统全部回收。

为了避免数据丢失,把变量从内存中变成可存储或传输的过程称之为序列化

序列化之后,就可以把序列化后的内容写入磁盘,或者通过网络传输到别的机器上。

反过来,把变量内容从序列化的对象重新读到内存里称之为反序列化

先用常规的方法将一个字典写入到文件中

info = {
    'name':"zhang",
    'age':22
}
with open('test.txt','w') as f:
    #字典无法写入文件,必须转换成字符串
    f.write(str(info))

执行程序,查看test.txt文件内容如下:

{'name': 'zhang', 'age': 22}

读取文件内容,加载到内存中,需要用到eval

eval() 将字符串str当成有效的表达式来求值并返回计算结果

with open('test.txt','r') as f:
    data = eval(f.read())
    print(data['name'])

执行输出 zhang

下面介绍 标准用法,用json模块

序列化:

import json
info = {
    'name':"zhang",
    'age':22
}
with open('test.txt','w') as f:
    f.write(json.dumps(info))
    #查看序列化之后的变量类型
    print(type(json.dumps(info)))

执行输出 class 'str'

可以看到类型是字符串了。

反序列化:

import json
with open('test.txt','r') as f:
    data = json.loads(f.read())
    print(data['name'])

执行输出 zhang

json只能处理简单的数据类型,比如:字符串、字典、列表等

不支持函数,类 转换。

json主要用于不同语言之间数据交互

是目前主流的数据交互格式。

那么其他复杂的数据类型,要序列化,怎么办呢?用pickle

pickle,用于python特有的类型 和 python的数据类型间进行转换。

pickle的语法和json是一样的

序列化

import pickle
info = {
    'name':"zhang",
    'age':22
}
#因为pickle之后,类型是二进制,所以模式是wb
with open('test.txt','wb') as f:
    f.write(pickle.dumps(info))
    #查看序列化之后的变量类型
    print(type(pickle.dumps(info)))

执行输出 class 'bytes'

反序列化

import pickle
with open('test.txt','rb') as f:
    data = pickle.loads(f.read())
    print(data['name'])

执行输出 zhang

注意:pickle的数据类型只有python能用,其他语言,比如java是不能识别的。

pickle代码优化

序列化

import pickle
info = {
    'name':"zhang",
    'age':22
}
with open('test.txt','wb') as f:
    pickle.dump(info,f)

执行效果同上

pickle.dump(info,f) 就等同于 f.write(pickle.dumps(info))

反序列化

import pickle
with open('test.txt','rb') as f:
    data = pickle.load(f)
    print(data['name'])

执行效果同上

pickle.load(f) 等同于 pickle.loads(f.read())

举一个特殊例子

多次序列化

这里先序列化一次,修改年龄之后,再序列化一次

import json

info = {
    'name':"zhang",
    'age':22
}
with open('test.txt','w') as f:
    json.dump(info,f)
    info['age'] = 21
    json.dump(info, f)

执行程序,查看test.txt内容

{"name": "zhang", "age": 22}{"name": "zhang", "age": 21}

反序列化

import json
with open('test.txt','r') as f:
    data = json.load(f)
    print(data['name'])

执行程序,报错

json.decoder.JSONDecodeError: Extra data: line 1 column 29 (char 28)

注意:在python 3.0版本中,一个文件只允许序列化一次。

举个场景,VMware Workstation软件可以创建多个快照,并且可以恢复到任意的快照。它是怎么做到的呢?就是每个快照,有独立的文件。

所以在python中,要想序列化多次,必须每次保存的文件是不一样的才行。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Python开发之序列化与反序列化:pi

      在日常开发中,所有的对象都是存储在内存当中,尤其是像python这样的坚持一切接对象的高级程序设计语言,一旦关机,在写在内存中的数据都将不复存在。另一方面,...

    py3study
  • python3--序列化模块,hashlib模块

    __len__    len(obj)的结果依赖于obj.__len__()的结果,计算对象的长度

    py3study
  • python中报错"json.decod

    在学习python语言中用json库解析网络数据时,我遇到了两个编译错误:json.decoder.JSONDecodeError: Expecting pro...

    py3study
  • 左手用R右手Python系列之——json序列化与反序列化

    json格式数据作为如今越来越流行的数据交换格式,几乎已经成为web端数据交互的标准,主流的数据科学语言R,Python都中都有非常完善的半结构化数据与json...

    数据小磨坊
  • 用Python上传文件

    Python正在吞噬这个世界!您会发现许多热情的Python程序员和同样多的批评者,但不可否认的是,Python在当今软件开发中是一个强大的、相关的、不断增长的...

    py3study
  • curl 命令详解,省的来回找了【Linux】

    1. curl命令是一个利用URL规则在命令行下工作的文件传输工具。它支持文件的上传和下载,所以是综合传输工具,但按传统,习惯称curl为下载工具。作为一款强力...

    sinnoo
  • [日常] 跨语言的POST请求问题的解决

    部门对外提供了一个HTTP的POST接口,但是对方公司的程序员使用C语言进行的调用,PHP这边一直无法获取到参数.遇到这种情况是因为对方没有完全按照HTTP协议...

    陶士涵
  • Python网络数据采集之读取文件|第05天

    文档编码的方式通常可以根据文件的扩展名进行判断,虽然文件扩展名并不是由编码确定的,而是由开发者确定的。从最底层的角度看,所有文档都是由 0和 1 编码而成的。例...

    你好我是森林
  • 腾讯放大招!2018将是微信小程序和人工智能爆发的一年?

    日前,微信更新了App版本,小程序一天内连发两个大招:小游戏和腾讯浏览器垂直搜索开放。相当于小程序最大的金矿型类目终于开放了。“玩一个小游戏才是正经事。” ? ...

    企鹅号小编
  • @程序员:Python 3.8正式发布,重要新功能都在这里

    【导读】最新版本的Python发布了!今年夏天,Python 3.8发布beta版本,但在2019年10月14日,第一个正式版本已准备就绪。现在,我们都可以开始...

    AI科技大本营

扫码关注云+社区

领取腾讯云代金券