首页 > 代码库 > json,pickle浅析,请指教

json,pickle浅析,请指教

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式

由于文件在内存中只能以二进制、字符串的形式存储。当存储字典、函数的时候,就需要使用json序列化。json就好比是虚拟机中的挂起,随时打开,随时挂起。

一、存储字典数据

1、json序列化数据

import json
info = {‘age‘:22,‘name‘:‘peter‘,‘email‘:‘@qq.com‘}
f = open(‘test.txt‘,‘w‘)    #打开test.txt文件,并写入
f.write(json.dumps(info))    #json.dumps对数据进行编码,不负责写入!
print (json.dumps(info))    #打印json.dumps编码后的数据
f.close()

此时数据已经以字符串的形式存储在硬盘。如果只取出其中[age]的数据,下面的例子是无法提取数据的。

2、错误示范

f = open(‘test.txt‘,‘r‘)
date = f.read()
print (date[‘age‘])
f.close()

原因分析:因为数据只能以字符串、二进制的形式存储,直接以字典的形式“date[age]”是绝对无法提取的。

3、json反序列化数据  

import json
f = open(‘test.txt‘,‘r‘)        #打开test.txt文件,并读取
date = json.loads(f.read())    #json.loads对数据进行解码
print (date[‘age‘])
print (date[‘name‘])
f.close()

经过json.loads解码的数据将恢复成源数据的样式,可以直接输出。

4、另一种简单方法(eval()方法)

f.open(‘test.txt‘,‘r‘)
date = eval(f.read())
print (date([‘age‘]))
f.close()

二、存储函数(pickle)

json只能处理简单的数据类型,例如:字典、列表等。无法处理函数。json在所有语言中都通用,可以用于不同语言之间交互。

pickle可以处理复杂的数据,使用方式和json一模一样!pickle只适用于python

1、pickle序列化数据

import pickle
def hello(name):
    print (‘hello!‘,name)
info = {
        ‘age‘:22,‘name‘:‘peter‘,‘email‘:‘@qq.com‘,
        ‘func‘:hello}    #函数hello的内存地址传递给func
 f = open(‘test1.py‘,‘wb‘)    #pickle.dumps()直接将数据转发为二进制存储,因此需要用‘wb‘
 print (pickle.dumps(info))    #打印pickle编码后的数据
 f.write(pickle.dumps(info))    #写入编码后数据
 f.close()

析:pickle具有一套语法规则,编码后的数据在文件中是以一种类似“乱码”的样子存储

2、pickle反序列化(错误示范

import pickle
f = open(‘test1.txt‘,‘rb‘)    #存储的二进制,必须用‘re‘读取
date = pickle.loads(f.read())    
print (date)

原因分析:此时是无法执行的。因为test1.txt中存储了一个函数“hello”,当序列化的代码执行完之后,函数“hello”的内存地址就会被释放,因此字典info中‘func’就没有值。

3、pickle反序列化(正确示范

import pickle
def hello(name):
    print (‘hello,hello!!‘,name)
f = open(‘test1.txt‘,‘rb‘)
date = pickle.loads(f.read())
print (date[‘func‘])        #输出内存地址
print(date[‘func‘](‘peter‘))    #调用hello函数,输出“hello,hello!!,peter”

由于之前函数被释放,重新定义相同函数名字的函数即可。

三、小技巧

1、简写方式

f.write(json.dumps(info))
json.loads(f.read())

   以上代码可以简写为:

json.dump(info,f)
json.load(f)

2、多次dump,一次load(3.0以上版本)

import json
info = {‘age‘:22,‘name‘:‘peter‘,‘email‘:‘@qq.com‘}
f = open(‘test.txt‘,‘w‘)
json.dump(info,f)
info[‘age‘]=‘33‘
json.dump(info,f)
info[‘name‘]=‘Tom‘
json.dump(info,f)

结果会输出三个字典,此时通过json.load(f)就会出错!但是刻印通过for循环调用数据






疑问:1.pickle在处理函数时,具体是序列化整个函数,还是函数的内存地址

json,pickle浅析,请指教