序列化及json&pickle的使用

一、序列化

  序列化是指把内存里的数据类型转变成字符串。以使其能存储到硬盘或通过网络传输到远程。——硬盘或网络传输时只能接受bytes。

Python中用于序列化的两个模块:

  • json:用于字符串和Python数据类型之间进行转换
  • pickle:用于Python特有类型和Python数据类型间进行转换。

  json和pickle模块都提供了四个功能:dumps、dump、loads、load

1、序列化

# 把内存数据转成字符,叫做序列化
data = {
    'roles':[
        {'role':'monster','type':'pig'},
        {'role':'hero','type':'关羽'}
    ]
}

f = open("game_status","w")
# f.write(data)   # 写入失败,write只能接收字符串或者是bytes
f.write(str(data))  # 内容写入文件中

2、反序列化

# 把字符转成内存数据类型,叫做反序列化
f = open("game_status","r")
d = f.read()
d = eval(d)
print(d['roles'])

二、json模块

把数据类型转成字符串存到内存里的意义:

  1、把你的内存数据通过网络共享给远程其他人

  2、定义了不同语言之间的交互规则

    纯文本:不能共享复杂的数据类型

    xml:占空间大

    json:相对来说,简单且可读性好。

import json
data = {
    'roles':[
        {'role':'monster','type':'pig'},
        {'role':'hero','type':'关羽'}
    ]
}

d = json.dumps(data)  # 仅转为字符串,可以存入硬盘
print(d,type(d))
"""
输出:{"roles": [{"role": "monster", "type": "pig"}, {"role": "hero", "type": "\u5173\u7fbd"}]} <class 'str'>
"""

f = open("test.json","w")  # 创建文件对象
d1 = json.dump(data,f)  # dump不仅将数据变为字符串还直接写入文件,但是只能存入文件对象中


d2 = json.loads(d)  # 仅把字符串转为相应的数据类型
print(d2['roles'],type(d2))
"""
输出:[{'role': 'monster', 'type': 'pig'}, {'role': 'hero', 'type': '关羽'}] <class 'dict'>
"""

# 从文件中读入:
f = open("test.json","r")
data = json.load(f)
print(data['roles'])

三、pickle模块

import pickle

d = {'name':'alex','age':22}
l = [1,2,3,4,'rain']
pk = open("data.pkl","wb")  # 针对bytes内容必须配置为wb模式
print(pickle.dumps(d))  # b'\x80\x03}q\x00(X\x04\x00\x....  bytes类型
pickle.dump(d,pk)
"""
data.pkl文件内容:�}q(XnameqXalexqXageqKu.
文件格式不可直接读。
"""

f = open("data.pkl","rb")
d = pickle.load(f)
print(d)
"""
输出:{'name': 'alex', 'age': 22}
"""

def sayhi():
    print('dddddd')

pickle.dumps(sayhi)
"""
执行不报错,说明pickle可以支持函数序列化
"""

四、json&pickle对比

json:

  优点:跨语言、体积小

  缺点:只能支持int\str\list\tuple\dict

pickle:

  优点:专为Python设计,支持Python所有的数据类型。

  缺点:只能在Python中使用,存储数据占空间大。

 

posted @ 2018-04-04 15:46  休耕  阅读(332)  评论(0编辑  收藏  举报