json&pickle序列化

1、简述

咱们在写入文件中的数据,只能是字符串,可是若是要想把内存的数据对象存到硬盘上去怎么办呐?下面就来讲说序列化:json & picklepython

2、json序列化

一、dumps序列化和loads反序列化json

dumps()序列化函数

import  json   #导入json模块
 
info = {
    'name':"seven",
    "age":32
}
 
with open("test.txt","w") as f:  #以普通模式写入
    data = json.dumps(info) #把内存对象转为字符串
    f.write(data)   #写到文件中
 
#text.txt文件中的内容
{"name": "seven", "age": 32}

loads()反序列化spa

import json
 
with open("test.txt","r") as f:  #以普通模式读
    data = json.loads(f.read())   #用loads反序列化
 
print(data.get("age"))
 
#输出
32

二、dump序列化和load反序列化code

dump()序列化对象

import  json
 
info = {
    'name':"seven",
    "age":32
}
 
with open("test.txt","w") as f:   #文件以写的方式打开
    json.dump(info,f)    #第1个参数是内存的数据对象 ,第2个参数是文件句柄
 
#text.txt文件中的内容
{"name": "seven", "age": 32}

load()反序列化blog

import json
 
with open("test.txt","r") as f:   #以读的方式打开文件
    data = json.load(f)  #输入文件对象
 
print(data["age"])
 
#输出
32

三、序列化函数内存

import  json
 
def sayhi(name):  #函数
    print("name:",name)
 
info = {
    'name':"seven",
    "age":32,
    "func":sayhi    #引用sayhi函数名
}
 
with open("test.txt","w") as f:
    json.dump(info,f)   #序列化info数据对象
 
#输出
 File "D:\Python\Python35\lib\json\encoder.py", line 403, in _iterencode_dict
    yield from chunks
  File "D:\Python\Python35\lib\json\encoder.py", line 436, in _iterencode
    o = _default(o)
  File "D:\Python\Python35\lib\json\encoder.py", line 179, in default
    raise TypeError(repr(o) + " is not JSON serializable")
TypeError: <function sayhi at 0x00000000006DD510> is not JSON serializable  #不支持json序列化

小结:字符串

  1. dumps和loads是成对使用的,dump和load是成对使用的。
  2. dumps和loads因为序列化的是内容,因此后面要加s,可是dump和load序列化的内容是对象,因此单数。
  3. json只能处理简单的数据类型,例如:字典、列表、字符串等,不能处理函数等复杂的数据类型。
  4. json是全部语言通用的,全部语言都支持json,若是咱们须要python跟其余语言进行数据交互,那么就用json格式。

2、pickle序列化

一、dumps序列化和loads反序列化get

dumps()序列化

import pickle
 
info = {
    'name':"seven",
    "age":32,
}
 
with open("test.txt","wb") as f:   #以二进制的形式写入
    data = pickle.dumps(info)   #序列化成字符串
    f.write(data)   #写入test.txt 文件中
 
#输出到test.txt文件中的内容
�}q (X   ageqKX   nameqX
   sevenqu.

loads()反序列化

import pickle
 
with open("test.txt","rb") as f: #以二进制的模式读
    data = pickle.loads(f.read())   #反序列化操做
 
print(data.get("age"))
 
#输出
32

二、dump序列化和load反序列化

dump()序列化

import pickle
 
info = {
    'name':"seven",
    "age":32,
}
 
with open("test.txt","wb") as f:
    pickle.dump(info,f)  #序列化
 
#输出
�}q (X   ageqKX   nameqX
   sevenqu.

load()反序列化

import pickle
 
with open("test.txt","rb") as f:
    data = pickle.load(f)  #反序列化成内存对象
 
print(data.get("age"))
 
#输出
32

从上面的结果观察,json和pickle好像也没什么区别?可是别忘了,咱们说,json只能序列化简单的数据类型,而pickle能够序列化python中全部的数据类型,包括函数、类等,下面咱们就来看看,如何序列化函数的。还有就是,pickle序列化的是字节,而json序列化的是字符,这个要注意一下。

三、序列化函数

①序列化

import pickle
 
def sayhi(name):   #函数
    print("hello:",name)
 
info = {
    'name':"seven",
    "age":32,
    "func":sayhi    #"func"对应的值sayhi,是函数名
}
 
with open("test.txt","wb") as f:
    data = pickle.dumps(info)
    f.write(data)
 
#输出test.txt
�}q (X   funcqc__main__
sayhi
qX   ageqKX   nameqX
   seven.

②反序列化

import pickle
 
def sayhi(name):   #在反序列化中必须写上此函数,否则会报错,由于在加载的时候,函数没有加载到内存
    print("hello:",name)
 
with open("test.txt","rb") as f:
    data = pickle.loads(f.read())
 
print(data.get("age"))
 
data.get("func")("seven")  #执行函数sayhi
 
#输出
32
hello: seven   #输出的函数体中的逻辑也是能够变的,这边我就不作演示了

小结:

  1. json值支持简单的数据类型,pickle支持全部的数据类型。
  2. pickle只能支持python自己的序列化和反序列化,不能用做和其余语言作数据交互,而json能够。
  3. pickle序列化的是整个的数据对象,因此反序列化函数时,函数体中的逻辑变了,是跟着新的函数体走的。
  4. pickle和json在3.0中只能dump一次和load一次,在2.7里面能够dump屡次,load屡次,anyway,之后只记住,只须要dump一次,load一次就能够了。
相关文章
相关标签/搜索