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在处理函数时,具体是序列化整个函数,还是函数的内存地址

时间: 2024-11-03 21:16:55

json,pickle浅析,请指教的相关文章

【python】-- json & pickle、xml、requests、hashlib、shelve、shutil、configparser、subprocess

json & pickle Python中用于序列化的两个模块 json     用于[字符串]和 [python基本数据类型] 间进行转换 pickle   用于[python特有的类型] 和 [python基本数据类型]间进行转换 Json模块提供了四个功能:dumps.dump.loads.load 1.dumps序列化和loads反序列化 dumps()序列化 import json #导入json模块 info = { 'name':"zhangqigao", &qu

模块调用,datetime,time,logging,递归,双层装饰器, json,pickle迭代器和生成器

一.python模块(导入,内置,自定义,开源) 1.模块简介 模块是一个包含所有你定义的函数和变量的文件,其后缀名是.py.模块可以被别的程序引入,以使用该模块中的函数等功能.这也是使用python标准库的方法. 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合.而对于一个复杂的功能来,可能需要多个函数才能完成(函数又可以在不同的.py文件中),n个 .py 文件组成的代码集合就称为模块. 2.模块的引入 在Python中用关键字

python 常用模块 time random os模块 sys模块 json & pickle shelve模块 xml模块 configparser hashlib subprocess logging re正则

python 常用模块 time random os模块 sys模块 json & pickle shelve模块 xml模块 configparser hashlib  subprocess logging re正则 转自老男孩老师Yuan:http://www.cnblogs.com/yuanchenqi/articles/5732581.html 模块&包(* * * * *) 模块(modue)的概念: 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,

Day4 - 迭代器&生成器、装饰器、Json & pickle 数据序列化、软件目录结构规范

---恢复内容开始--- 本节内容 迭代器&生成器 装饰器 Json & pickle 数据序列化 软件目录结构规范 作业:ATM项目开发 1.列表生成式,迭代器&生成器 列表生成式 需求:列表a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],要求把列表里的每个值加1 1 a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 2 b = [] 3 for i in a: 4 b.append(i+1) 5 a = b 6 print(a) 普通青

json & pickle

json & pickle json:一般用于不同的程序语言之间的序列化与反序列化,它的核心就是字符串,是字符串和python的基本数据类型之间的转换 json模块提供了四个功能:dumps, dump(序列化, 存), loads(反序列化, 读), load #json.loads用于将字典,列表,元素形式的字符串,转换成相应的字典.列表.元组 #对于字典里面的内容,里面必须要是"" #例子: l = "[11,22,33,44]" import jso

python开发模块基础:序列化模块json,pickle,shelve

一,为什么要序列化 # 将原本的字典.列表等内容转换成一个字符串的过程就叫做序列化'''比如,我们在python代码中计算的一个数据需要给另外一段程序使用,那我们怎么给?现在我们能想到的方法就是存在文件里,然后另一个python程序再从文件里读出来.但是我们都知道,对于文件来说是没有字典这个概念的,所以我们只能将数据转换成字典放到文件中.你一定会问,将字典转换成一个字符串很简单,就是str(dic)就可以办到了,为什么我们还要学习序列化模块呢?没错序列化的过程就是从dic 变成str(dic)的

Python-Day4 Python基础进阶之生成器/迭代器/装饰器/Json & pickle 数据序列化

一.生成器 通过列表生成式,我们可以直接创建一个列表.但是,受到内存限制,列表容量肯定是有限的.而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了.所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间.在Python中,这种一边循环一边计算的机制,称为生成器:generator. 要创建一个generator,有很多种

json&pickle序列化

一.用途 我们需要将内存中的数据进行序列化,即写入文件中时,写入的类型只能是字符串或者二进制类型.但是如果我们想要将复杂一些的数据类型,如:列表.字典或者函数之类的同样进行序列化,我们就要用到 json或者pickle. 二.json序列化 1.dumps序列化和loads反序列化 dumps把数据类型转换成字符串 import json info = { 'name': 'The Count of Monte Cristo', 'type': 'Movie' } data = json.dum

Python学习笔记——基础篇【第五周】——json & pickle 模块

json & pickle 模块(序列化) 用于序列化的两个模块 json,用于字符串 和 python数据类型间进行转换 pickle,用于python特有的类型 和 python的数据类型间进行转换 Json模块提供了四个功能:dumps.dump.loads.load pickle模块提供了四个功能:dumps.dump.loads.load dumps和dump区别: pickle.dump(info,f) #print(pickle.dumps(info)) #f.write(pick