一:pickle 序列化模块
把不能够直接存储的数据,变得可存储就是序列化
把存储好的数据,转化成原本的数据类型,加做反序列化

php: 序列化和反序列化
(1)serialize
(2)unserialize


#1.dumps 把任意对象序列化成一个bytes
#例:

#导入pickle模块 => 模块.方法()
import pickle

lst = [1,2,3,4,5,6]
res = pickle.dumps(lst)
print(res,type(res))
#b'\x80\x03]q\x00(K\x01K\x02K\x03K\x04K\x05K\x06e.' <class 'bytes'>
#2.loads 把任意bytes反序列化成原来数据

res = pickle.loads(res)
print(res,type(res))

#encode decode 能实现序列化吗?
'''只有字符串可以使用encode 或 decode ,容器类型数据等不可以'''
#res = lst.encode("utf-8")
#print(res)

#对函数进行序列化

#例2:

import pickle
def func():
    print("哈哈哈哈哈哈哈哈哈哈")
func()
# 序列化成字符串
res = pickle.dumps(func)
print(res)
#反序列化字节流 恢复原来的数据类型
res = pickle.loads(res)
print(res)
res()
对函数序列化例2输出结果为:

哈哈哈哈哈哈哈哈哈哈

b'\x80\x03c__main__\nfunc\nq\x00.'

<function func at 0x00000208DE411E18>

哈哈哈哈哈哈哈哈哈哈

#对迭代器进行序列化

import pickle
it = iter(range(10))
from collections import Iterable,Iterator
print(isinstance(it,Iterator))
res = pickle.dumps(it) #序列化
res = pickle.loads(res) #反序列化
for i in res:
    print(i) #输出:0 1 2 3 4 5 6 7 8 9

#所有数据类型都可以通过pickle模块进行序列化
#dump 把对象序列化后写入到file_like Object(即文件对象)
#load file_like Object(即文件对象)中的内容拿出来,反序列化原来数据

it = iter(range(10))
with open("ceshi.pkl",mode="wb") as fp:
    pickle.dump(it,fp)

with open("ceshi.pkl",mode="rb") as fp:
    res = pickle.load(fp)

print(res)
for i in res:
    print(i)

二:json
json 模块能够转化的数据类型如下:int float bool str list tuple dict None 8个数据可以序列化
json 数据类型的提出,是让不同的语言之间形成数据交流
pickle 返回的是二进制的字节流,它是用来进行数据的传输和存储的
json     序列化成一个字符串
pickle   序列化成一个字节流
#例:
import json
#dumps  loads 是一对,用来序列化和反序列化的,在字符串和其他数据之间切换
#序列化
#ensure_ascii = True 如果想要显示中文ensure_ascii = False
#sort_keys = True 对字典的键进行排序(默认按照ascii从小到大排序)
#例1:
dic = {'name':"ONE","age":8,"sex":"BOY","family":['FF',"MM"]}
res = json.dumps(dic,ensure_ascii=True,sort_keys=True)
print(res,type(res)) #{"age": 8, "family": ["FF", "MM"], "name": "ONE", "sex": "BOY"} <class 'str'>
#反序列化
res = json.loads(res)
print(res,type(res)) #{'age': 8, 'family': ['FF', 'MM'], 'name': 'ONE', 'sex': 'BOY'} <class 'dict'>

# #dump  load 是一对,用来进行数据的存储和提取
#例2:(将dic写入到ceshi001.json到在通过load读出)

dic = {'name':"ONE","age":8,"sex":"BOY","family":['FF',"MM"]}
with open("ceshi001.json",mode="w",encoding="utf-8") as fp:
    res1 = json.dump(dic,fp,ensure_ascii=False)
with open("ceshi001.json",mode="r",encoding="utf-8") as fp:
    res = json.load(fp)
print(res,type(res))

三:json  pickle 两个模块之间的区别
#json
可以连续dump,但是load只能一次性把所有数据拿出来,进行反序列化,造成数据错误
针对于这个弊端,可以使用loads来解决

dic = {'a':1,'b':2}
with open('ceshi002.json',mode="w",encoding='utf-8') as fp:
    json.dump(dic,fp)
    fp.write('\n')
    json.dump(dic,fp)
    fp.write('\n')
print("=====================")
with open("ceshi002.json",mode="r",encoding="utf-8") as fp:
    #res = json.load(fp) error
    for i in fp:
        #读一行,反序列化成一个字典,一次循环
        res= json.loads(i)
        print(res,type(res))

#pickle
允许连续dump,也允许连续load
#例1:
import pickle
dic = {'a':3,'b':4}
with open("ceshi003.pkl",mode="wb") as fp:
    pickle.dump(dic,fp)
    pickle.dump(dic,fp)
    pickle.dump(dic,fp)
    pickle.dump(dic,fp)

with open("ceshi003.pkl",mode="rb") as fp:
    '''
    res = pickle.load(fp)
    print(res)
    res = pickle.load(fp)
    print(res)
    res = pickle.load(fp)
    print(res)
    res = pickle.load(fp)
    print(res)
    '''
    #res = pickle.load(fp)
    #print(res)

   #是否可以把所有数据都一次性拿出来
   #try...except..抑制多调用的那一次的报
#异常格式

try:
        while True:
            res = pickle.load(fp)
            print(res)

except:
        pass

json  pickle 两个模块的区别总结
(1) json序列化之后的数据类型是str ,所有编程语言都识别
    但是仅限于(int float bool )(str list tuple dict None)
    json不能连续load,只能一次性拿出来所有数据
    
(2)pickle序列化之后的呼声类型是bytes,
    所有数据类型都可以转化,但仅限于python之间的存储传输
    pickle可以连续load,多套数据放在同一个文件中

Python 基础之序列化模块pickle与json的更多相关文章

  1. Python序列化模块pickle和json使用和区别

    这是用于序列化的两个模块: • json: 用于字符串和python数据类型间进行转换 • pickle: 用于python特有的类型和python的数据类型间进行转换 Json模块提供了四个功能:d ...

  2. Python中的序列化以及pickle和json模块介绍

    Python中的序列化指的是在程序运行期间,变量都是在内存中保存着的,如果我们想保留一些运行中的变量值,就可以使用序列化操作把变量内容从内存保存到磁盘中,在Python中这个操作叫pickling,等 ...

  3. 十八. Python基础(18)常用模块

    十八. Python基础(18)常用模块 1 ● 常用模块及其用途 collections模块: 一些扩展的数据类型→Counter, deque, defaultdict, namedtuple, ...

  4. python基础31[常用模块介绍]

    python基础31[常用模块介绍]   python除了关键字(keywords)和内置的类型和函数(builtins),更多的功能是通过libraries(即modules)来提供的. 常用的li ...

  5. python基础,函数,面向对象,模块练习

    ---恢复内容开始--- python基础,函数,面向对象,模块练习 1,简述python中基本数据类型中表示False的数据有哪些? #  [] {} () None 0 2,位和字节的关系? # ...

  6. Python基础-包与模块

    Python基础-包与模块 写在前面 如非特别说明,下文均基于Python3 摘要 为重用以及更好的维护代码,Python使用了模块与包:一个Python文件就是一个模块,包是组织模块的特殊目录(包含 ...

  7. python基础-包和模块

    Python基础-包与模块 写在前面 如非特别说明,下文均基于Python3 摘要 为重用以及更好的维护代码,Python使用了模块与包:一个Python文件就是一个模块,包是组织模块的特殊目录(包含 ...

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

    一,为什么要序列化 # 将原本的字典.列表等内容转换成一个字符串的过程就叫做序列化'''比如,我们在python代码中计算的一个数据需要给另外一段程序使用,那我们怎么给?现在我们能想到的方法就是存在文 ...

  9. python基础(20):序列化、json模块、pickle模块

    1. 序列化 什么叫序列化——将原本的字典.列表等内容转换成一个字符串的过程就叫做序列化. 1.1 为什么要有序列化 为什么要把其他数据类型转换成字符串?因为能够在网络上传输的只能是bytes,而能够 ...

随机推荐

  1. 推荐 C/C++ 人工智能 框架和库

    2018年10月22日 22:59:58 yangminggg 阅读数:2217   值得推荐的C/C++框架和库 C++资源大全 关于 C++ 框架.库和资源的一些汇总列表,内容包括:标准库.Web ...

  2. 【转】通过python调用jenkins 常用api操作

    原:https://www.cnblogs.com/L-O-N/p/11608220.html # -*- coding: utf- -*- import jenkins class TestJenk ...

  3. Educational Codeforces Round 73

    唉,又是掉分的一场比赛... A. 2048 Game 题意:给出一个数组,问能不能通过一系列操作(将数组中的两个数相加变成另一个数),使得数组中包含2048,数组中的数全是2的指数,可以则输出YES ...

  4. netty(六) buffer 源码分析

    问题 : netty的 ByteBuff 和传统的ByteBuff的区别是什么? HeapByteBuf 和 DirectByteBuf 的区别 ? HeapByteBuf : 使用堆内存,缺点 ,s ...

  5. CodeBlocks17.12配置GNU GCC + 汉化

    Codeblocks17.12以及Gcc和汉化包链接: 链接:https://pan.baidu.com/s/1F23fjvi8xRpQ9xR14ILpEA 提取码:90d6 一.TDM-GCC 的安 ...

  6. 「NOIP2016」蚯蚓

    传送门 Luogu 解题思路 很容易想到用一个堆去维护,但是复杂度是 \(O((n+m)\log(n+m))\) 的,显然过不了 \(7e6\). 其实这题有一个性质: 先被切开的蚯蚓,得到的两条新蚯 ...

  7. Java入门笔记 03-面向对象(中)

    介绍:这部分内容主要是介绍和总结封装.继承和多态. 一. 封装:把该隐藏的隐藏起来,把该暴露的暴露出来 封装是指将信息隐藏在对象内部,不允许外部程序直接访问对象内部信息,而是通过该类所提供的方法来实现 ...

  8. Windows事件ID

    51 Windows 无法找到网络路径.请确认网络路径正确并且目标计算机不忙或已关闭.如果 Windows 仍然无法找到网络路径,请与网络管理员联系. 52 由于网络上有重名,没有连接.请到“控制面板 ...

  9. Linux学习:进入与退出系统

    进入Linux系统:必须要输入用户的账号,在系统安装过程中可以创建以下两种帐号: 1.root--超级用户帐号(系统管理员),使用这个帐号可以在系统中做任何事情. 2.普通用户--这个帐号供普通用户使 ...

  10. Ubuntu18 mongodb 离线安装

    环境 Ubuntu 18 + mongodb 4.0.10 1.下载版本所需库 https://www.mongodb.com/download-center/community https://re ...