一、用途

  我们需要将内存中的数据进行序列化,即写入文件中时,写入的类型只能是字符串或者二进制类型。但是如果我们想要将复杂一些的数据类型,如:列表、字典或者函数之类的同样进行序列化,我们就要用到 json或者pickle。

二、json序列化

1、dumps序列化和loads反序列化

dumps把数据类型转换成字符串

import json

info = {
'name': 'The Count of Monte Cristo',
'type': 'Movie'
} data = json.dumps(info)
print(data)
print(type(data)) # 输出
{"name": "The Count of Monte Cristo", "type": "Movie"}
<class 'str'>

loads把字符串转换成数据类型

import json

get_info = json.loads(data)
print(get_info['name'])
print(get_info)
print(type(get_info)) #输出
The Count of Monte Cristo
{'name': 'The Count of Monte Cristo', 'type': 'Movie'}
<class 'dict'> 

2.dump序列化和load反序列化

dump把数据类型转换成字符串并存储在文件中

import json

info = {
'name': 'The Count of Monte Cristo',
'type': 'Movie'
} with open("test.txt", "w", encoding="utf-8") as f:
json.dump(info, f) # 第一个参数是内存中的数据对象,第二个参数是文件句柄 #写入文件中的内容
{"name": "The Count of Monte Cristo", "type": "Movie"}

load把文件打开从字符串转换成数据类型

import json

with open("test.txt", "r", encoding="utf-8") as f:
data_from_file = json.load(f) print(data_from_file['name'])
print(data_from_file)
print(type(data_from_file)) #输出
The Count of Monte Cristo
{'name': 'The Count of Monte Cristo', 'type': 'Movie'}
<class 'dict'>

  

3.json序列化一个函数

import json

def test(name):
print("hello,{}".format(name)) info = {
'name': 'The Count of Monte Cristo',
'type': 'Movie',
'func': test
} data = json.dumps(info) #输出
File "G:/python/untitled/study6/json&pickle模块.py", line 22, in <module>
data = json.dumps(info)
File "G:\python\install\lib\json\__init__.py", line 230, in dumps
return _default_encoder.encode(obj)
File "G:\python\install\lib\json\encoder.py", line 198, in encode
chunks = self.iterencode(o, _one_shot=True)
File "G:\python\install\lib\json\encoder.py", line 256, in iterencode
return _iterencode(o, 0)
File "G:\python\install\lib\json\encoder.py", line 179, in default
raise TypeError(repr(o) + " is not JSON serializable")
TypeError: <function test at 0x0000021B13C57F28> is not JSON serializable

1、json只能处理简单的数据类型,例如:字典、列表、字符串等,不能处理函数等复杂的数据类型。

2、json是所有语言通用的,所有语言都支持json,如果我们需要python跟其他语言进行数据交互,那么就用json格式

 

三、pickle序列化

pickle的用法和上面的相同,但是pickle序列化后的数据类型是二进制的,并且pickle只能在python中是使用。pickle序列化的是字节,而json序列化的是字符。

1.dumps && loads

import pickle

def test(name):
print("hello,{}".format(name)) info = {
'name': 'The Count of Monte Cristo',
'type': 'Movie',
'func': test
} data = pickle.dumps(info)
print(data)
print(type(data)) #输出
b'\x80\x03}q\x00(X\x04\x00\x00\x00nameq\x01X\x19\x00\x00\x00The Count of Monte Cristoq\x02X\x04\x00\x00\x00typeq\x03X\x05\x00\x00\x00Movieq\x04X\x04\x00\x00\x00funcq\x05c__main__\ntest\nq\x06u.' <class 'bytes'>
import pickle

get_data = pickle.loads(data)
get_data['func']('cat')
print(get_data) #输出
hello,cat
{'name': 'The Count of Monte Cristo', 'type': 'Movie', 'func': <function test at 0x00000235350A7F28>}

  

2. dump && load

import pickle

def test(name):
print("hello,{}".format(name)) info = {
'name': 'The Count of Monte Cristo',
'type': 'Movie',
'func': test
} with open('test.txt', 'wb') as f:
pickle.dump(info, f) # 写入test.txt文件中的内容 �}q (X typeqX MovieqX funcqc__main__
test
qX nameqX The Count of Monte Cristoqu.

  

import pickle

with open('test.txt', 'rb') as f:
get_data = pickle.load(f)
print(get_data) # 输出 {'name': 'The Count of Monte Cristo', 'func': <function test at 0x000001BA2AB4D510>, 'type': 'Movie'}

  

总结:

  • json值支持简单的数据类型,pickle支持所有的数据类型。
  • pickle只能支持python本身的序列化和反序列化,不能用作和其他语言做数据交互,而json可以。
  • pickle序列化的是整个的数据对象,所以反序列化函数时,函数体中的逻辑变了,是跟着心的函数体走的。

json&pickle序列化的更多相关文章

  1. Python3基础(4)匿名函数、装饰器、生成器、迭代器、内置函数、json&pickle序列化、软件目录开发规范、不同目录间模块调用

    ---------------个人学习笔记--------------- ----------------本文作者吴疆-------------- ------点击此处链接至博客园原文------ 1 ...

  2. json & pickle 序列化

    #!/usr/bin/python # -*- coding: utf-8 -*- # 序列化: 例如把字典写进文件 info = { 'name': 'alex', 'age': 22 } f = ...

  3. json&pickle序列化和软件开发规范

    json和pickle 用于序列化的两个模块 json   用于字符串和python数据类型间进行转换,json只支持列表,字典这样简单的数据类型 但是它不支持类,函数这样的数据类型转换 pickle ...

  4. 13、Python文件处理、os模块、json/pickle序列化模块

    一.字符编码 Python3中字符串默认为Unicode编码. str类型的数据可以编码成其他字符编码的格式,编码的结果为bytes类型. # coding:gbk x = '上' # 当程序执行时, ...

  5. Python序列化,json&pickle&shelve模块

    1. 序列化说明 序列化可将非字符串的数据类型的数据进行存档,如字典.列表甚至是函数等等 反序列化,将通过序列化保存的文件内容反序列化即可得到数据原本的样子,可直接使用 2. Python中常用的序列 ...

  6. 第五章 模块之 shtil 、 json / pickle、importlib、collections

    5.8 shtil 高级的 文件.文件夹.压缩包 处理模块 shutil.rmtree 删除目录 import shutilshutil.rmtree(path) shutil.move 重命名:移动 ...

  7. python常用模块(模块和包的解释,time模块,sys模块,random模块,os模块,json和pickle序列化模块)

    1.1模块 什么是模块: 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护. 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文 ...

  8. python序列化: json & pickle & shelve 模块

    一.json & pickle & shelve 模块 json,用于字符串 和 python数据类型间进行转换pickle,用于python特有的类型 和 python的数据类型间进 ...

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

    一.生成器 通过列表生成式,我们可以直接创建一个列表.但是,受到内存限制,列表容量肯定是有限的.而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面 ...

随机推荐

  1. Python中import的as语法

    在Python中,如果import的语句比较长,导致后续引用不方便,可以使用as语法,比如: import dir1.dir2.mod # 那么,后续对mod的引用,都必须是dir1.dir2.mod ...

  2. "群英队"电梯演讲

    视频如下: https://imgcache.qq.com/tencentvideo_v1/playerv3/TPout.swf?max_age=86400&v=20161117&vi ...

  3. myeclipse和ecplise中安装git插件的问题

    我的myeclipse10.7和ecplise helis一直安装不了git插件,myeclipse中details说我的myeclipse少了team_features等之类文件,helis的情况大 ...

  4. SVN版本合并技巧

    公司使用了bug管理系统,项目添加新功能时,建一个主工单,再分成多个子工单,将子工单分给多个程序员来开发. 开发人员完成一部分就提交一部分,多个小功能模块就分多次提交到测试主干,然后用测试主干项目发布 ...

  5. 自定义ClassLoader,用于加载用户JAR包

    最近在考虑C/S结构程序的软件自动升级的实现方式,比如QQ.飞信等都自动升级的功能. 自动升级模块虽然还没有编码完成,但是思路还是比较清晰的. 自动升级过程中,升级文件的JAR包是专门加载到程序中去的 ...

  6. String、StringBuilder与StringBuffer的区别

    1.String类是public.final修饰的. 在Java中,被final修饰的类是不允许被继承的,并且String它的成员方法都默认为final方法. 查看源码得知,String类其实是通过c ...

  7. 【Nginx】均衡负载权重模式实现session数据同步

    思路:把session存放到一个公共redis服务器上 每次浏览器请求服务端都会带上cookie,因为使用的是权重负载均衡方案,因此nginx反向代理服务器会把请求发放到不同的服务端,服务端用cook ...

  8. influxdb 命令

    写入数据: curl -X POST -d '[{"name":"foo","columns":["val"],&quo ...

  9. Linux下objdump查看C程序编译后的汇编代码

    http://m.blog.csdn.net/article/details?id=47747047 Uboot中start.S源码的指令级的详尽解析 http://www.crifan.com/fi ...

  10. npm 安装 不快的解决办法

    npm config list  查看配置 npm config set prefix “c:\dev\nvm\npm”(配置用npm下载包时全局安装的包路径) npm install npm -g ...