Python3 查缺补漏:1、序列化与反序列化

本贴最后更新于 1773 天前,其中的信息可能已经时移俗易

把 python 中的数据转换成 str---序列化
可以 str 转换成 python 的数据---反序列化

json 模块

json 所有的语言都通用,它能序列化的数据是有限的:字典列表和元组

  • json.dumps()与 json.loads()是一对
  • json.dump()与 json.load()是一对
  • json.dumps() 表示将序列号 “obj” 数据类型 转换为 JSON 格式的字符串
  • json.dump():理解为两个动作,一个动作是将”obj“转换为 JSON 格式的字符串,还有一个动作是将字符串写入到文件中,也就是说文件描述符 fp 是必须要的参数

实例:

import json

ret=json.dumps({'name':'mark'})
# str()是将作用对象“以字符串格式输出”,重在输出;
# repr()是“显示对象是什么东西”,重在表述。所以在调试程序时常常用后者打印。
print(str(ret),type(ret))
print(repr(ret),type(ret))


#将包含str类型的JSON文档反序列化为一个python对象
ret2=json.loads(ret)
print(repr(ret2),type(ret2))

输出:

{"name": "mark"} <class 'str'>
'{"name": "mark"}' <class 'str'>
{'name': 'mark'} <class 'dict'>

实例 2:

import json

data={'name':'mark'}

# 将数据写入文件
with open('json_file','w') as f:
    json.dump(data,f)
    f.close()

# 从文件读取数据
with open('json_file') as f:
    d=json.load(f)
    print(repr(d),type(d))

结果:

{'name': 'mark'} <class 'dict'>

pickle 模块

  • 是 python 特有的
  • 也是有 dumps() loads() , dump() load()使用方法和 json 一模一样
  • pickle 在 python 中可以序列化任何数据类型
  • python 专有的,不能和他语言兼容,结果是 bytes
  • 用 pickle 序列化的数据,反序列化也必须用 pickle

总结:

  • 1.json 序列化方法:dumps:无文件操作 dump:序列化 + 写入文件
  • 2.json 反序列化方法: loads:无文件操作 load: 读文件 + 反序列化
    1. json 模块序列化的数据 更通用
      picle 模块序列化的数据 仅 python 可用,但功能强大,可以序列号函数
  • 4.json 模块可以序列化和反序列化的数据类型见 python 对象(obj) 与 json 对象的对应关系表
python 对象(obj) json
dict object
list,tuple array
str string
int, float number
True true
False false
None null

shelve 模块

shelve 也是 python 提供给我们的序列化工具,比 pickle 用起来更简单一些
shelve 只提供给我们一个 open 方法,是用 key 来访问的,使用起来和字典类似

import shelve

f=shelve.open('shelve_file')
# 直接对文件句柄操作,就可以存入数据
f['key']={'int':10,'float':9.5,'string':'Sample data'}
f.close()


f1=shelve.open('shelve_file')
existing=f1['key']
f1.close()
# 这个模块有个限制,它不支持多个应用同一时间往同一个DB进行写操作。
# 所以当我们知道我们的应用如果只进行读操作,我们可以让shelve通过只读方式打开DB
print(repr(existing))

结果:

{'int': 10, 'float': 9.5, 'string': 'Sample data'}

实例 2:

# 不支持多个人同时写,支持多个人同时读,如果只是读的化,就设置flag='r'
import shelve

f1=shelve.open('shelve_file',flag='r')
existing=f1['key']
f1.close()
# 这个模块有个限制,它不支持多个应用同一时间往同一个DB进行写操作。
# 所以当我们知道我们的应用如果只进行读操作,我们可以让shelve通过只读方式打开DB
print(repr(existing))


# 由于shelve在默认情况下是不会记录待持久化对象的任何修改的,所以我们在shelve.open()时候需要修改默认参数,否则对象的修改不会保存。
# 正常情况下shelve打开的文件句柄感知不到值的修改,设置writeback = True就可以保存修改内容了

f2=shelve.open('shelve_file',writeback=True)
print(f2['key'])
f2['key']['new_value'] = 'this was not here before'
print(f2['key'])
f2.close()

结果:

{'int': 10, 'float': 9.5, 'string': 'Sample data'}
{'int': 10, 'float': 9.5, 'string': 'Sample data'}
{'int': 10, 'float': 9.5, 'string': 'Sample data', 'new_value': 'this was not here before'}

大总结:

  • json:所有语言通用,能转换的数据类型有限,重要程度 五颗星*****
  • pickle:只限于 python,能转换所有的数据类型 做游戏的时候会用到
  • shelve:只限于 python 语言,能转
  • Python

    Python 是一种面向对象、直译式电脑编程语言,具有近二十年的发展历史,成熟且稳定。它包含了一组完善而且容易理解的标准库,能够轻松完成很多常见的任务。它的语法简捷和清晰,尽量使用无异义的英语单词,与其它大多数程序设计语言使用大括号不一样,它使用缩进来定义语句块。

    536 引用 • 672 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...