python入门之内置模块--序列化模块(json模块pickle模块)

YongLiangのBOKE      2022-02-16     436

关键词:

Python 入门之 内置模块 -- 序列化模块(json模块、pickle模块)

1、序列化

Python中这种序列化模块有三种:

? json模块 :

? 不同语言都遵循的一种数据转化格式,即不同语言都使用的特殊字符串。(比如Python的一个列表[1, 2, 3]利用json转化成特殊的字符串,然后在编码成bytes发送给php的开发者,php的开发者就可以解码成特殊的字符串,然后在反解成原数组(列表): [1, 2, 3])

? json序列化只支持部分Python数据结构:dict,list, tuple,str,int, float,True,False,None

? pickle模块:

? 只能是Python语言遵循的一种数据转化格式,只能在python语言中使用。

? 支持Python所有的数据类型包括实例化对象。

? shelve模块:类似于字典的操作方式去操作特殊的字符串。

序列化的本质就是将一种数据结构(如字典,列表)等转换成一个特殊的序列(字符串或者bytes)的过程就叫做序列化。

(1)序列化模块就是将一个常见的数据结构转化成一个特殊的序列,并且这个特殊的序列还可以反解回去。

(2)主要用途:

<1> 文件读写数据

<2> 网络传输数据

(3)json模块

<1> json模块是将满足条件的数据结构转化成特殊的字符串,并且也可以反序列化还原回去

<2> 能够序列的数据类型:字典,列表,元组

? 4方法 2组

dumps loads ---- 用于网络传输
dump load ---- 用于文件存储

1> dumps、loads

[1] 将字典类型转换成字符串类型
import json
dic = {'k1':'v1','k2':'v2','k3':'v3'}
str_dic = json.dumps(dic)  #序列化:将一个字典转换成一个字符串
print(type(str_dic),str_dic)  #<class 'str'> {"k3": "v3", "k1": "v1", "k2": "v2"}
#注意,json转换完的字符串类型的字典中的字符串是由""表示的
[2] 将字符串类型的字典转换成字典类型
import json
dic2 = json.loads(str_dic)  #反序列化:将一个字符串格式的字典转换成一个字典
#注意,要用json的loads功能处理的字符串类型的字典中的字符串必须由""表示
print(type(dic2),dic2)  #<class 'dict'> {'k1': 'v1', 'k2': 'v2', 'k3': 'v3'}
[3] 还支持列表类型
list_dic = [1,['a','b','c'],3,{'k1':'v1','k2':'v2'}]
str_dic = json.dumps(list_dic) #也可以处理嵌套的数据类型 
print(type(str_dic),str_dic) #<class 'str'> [1, ["a", "b", "c"], 3, {"k1": "v1", "k2": "v2"}]
list_dic2 = json.loads(str_dic)
print(type(list_dic2),list_dic2) #<class 'list'> [1, ['a', 'b', 'c'], 3, {'k1': 'v1', 'k2': 'v2'}]

2> dump、load

[1] 将对象转换成字符串写入到文件当中
import json
f = open('json_file.json','w')
dic = {'k1':'v1','k2':'v2','k3':'v3'}
json.dump(dic,f)  #dump方法接收一个文件句柄,直接将字典转换成json字符串写入文件
f.close()
# json文件也是文件,就是专门存储json字符串的文件。
[2] 将文件中的字符串类型的字典转换成字典
import json
f = open('json_file.json')
dic2 = json.load(f)  #load方法接收一个文件句柄,直接将文件中的json字符串转换成数据结构返回
f.close()
print(type(dic2),dic2)
其他参数说明

ensure_ascii:,当它为True的时候,所有非ASCII码字符显示为uXXXX序列,只需在dump时将ensure_ascii设置为False即可,此时存入json的中文即可正常显示。

separators:分隔符,实际上是(item_separator, dict_separator)的一个元组,默认的就是(,,:);这表示dictionary内keys之间用“,”隔开,而KEY和value之间用“:”隔开。

sort_keys:将数据根据keys的值进行排序。

json序列化存储多个数据到同一个文件中

对于json序列化,存储多个数据到一个文件中是有问题的,默认一个json文件只能存储一个json数据,但是也可以解决,举例说明:

对于json 存储多个数据到文件中
dic1 = {'name':'oldboy1'}
dic2 = {'name':'oldboy2'}
dic3 = {'name':'oldboy3'}
f = open('序列化',encoding='utf-8',mode='a')
json.dump(dic1,f)
json.dump(dic2,f)
json.dump(dic3,f)
f.close()

f = open('序列化',encoding='utf-8')
ret = json.load(f)
ret1 = json.load(f)
ret2 = json.load(f)
print(ret)

上边的代码会报错,解决方法:

dic1 = {'name':'oldboy1'}
dic2 = {'name':'oldboy2'}
dic3 = {'name':'oldboy3'}
f = open('序列化',encoding='utf-8',mode='a')
str1 = json.dumps(dic1)
f.write(str1+'
')
str2 = json.dumps(dic2)
f.write(str2+'
')
str3 = json.dumps(dic3)
f.write(str3+'
')
f.close()

f = open('序列化',encoding='utf-8')
for line in f:
    print(json.loads(line))

(4)pickle模块

<1> pickle模块是将Python所有的数据结构以及对象等转化成bytes类型,然后还可以反序列化还原回去

<2> 只有Python有,几乎可以序列Python中所有数据类型,匿名函数不能序列

使用上与json几乎差不多,也是两对四个方法。

dumps loads ---- 用于网络传输
dump load ---- 用于文件存储

1> dumps、loads

import pickle
dic = {'k1':'v1','k2':'v2','k3':'v3'}
str_dic = pickle.dumps(dic)
print(str_dic)  # bytes类型

dic2 = pickle.loads(str_dic)
print(dic2)    #字典
# 还可以序列化对象
import pickle
def func():
    print(666)

ret = pickle.dumps(func)
print(ret,type(ret))  # b'x80x03c__main__
func
qx00.' <class 'bytes'>
f1 = pickle.loads(ret)  # f1得到 func函数的内存地址
f1()  # 执行func函数

2> dump、load

dic = {(1,2):'oldboy',1:True,'set':{1,2,3}}
f = open('pick序列化',mode='wb')
pickle.dump(dic,f)
f.close()
with open('pick序列化',mode='wb') as f1:
    pickle.dump(dic,f1)

pickle序列化存储多个数据到一个文件中

dic1 = {'name':'oldboy1'}
dic2 = {'name':'oldboy2'}
dic3 = {'name':'oldboy3'}

f = open('pick多数据',mode='wb')
pickle.dump(dic1,f)
pickle.dump(dic2,f)
pickle.dump(dic3,f)
f.close()

f = open('pick多数据',mode='rb')
while True:
    try:
        print(pickle.load(f))
    except EOFError:
        break
f.close()

自写一个pickle写入文件上下文

class MyPickle:
    def __init__(self,path,mode='load'):
        self.path = path
        self.mode = 'ab' if mode=='dump' else 'rb'

    def __enter__(self):
        self.f = open(self.path, mode=self.mode)
        return self

    def dump(self,content):
        pickle.dump(content,self.f)

    def __exit__(self, exc_type, exc_val, exc_tb):
        self.f.close()

    def __iter__(self):
        while True:
            try:
                yield  pickle.load(self.f)
            except EOFError:
                break


class Course:
    def __init__(self,name,price,period):
        self.name = name
        self.price = price
        self.period = period
python = Course('python',19800,'6 months')
linux = Course('linux',19800,'6 months')


with MyPickle('course_file') as p:
    for obj in p:
        print(obj.__dict__)
with MyPickle('course_file','dump') as p:
    p.dump(python)
    p.dump(linux)

with open('course_file','ab') as f:
    pickle.dump(linux,f)

with open('course_file','rb') as f:
    while True:
        try:
            obj = pickle.load(f)
            print(obj.__dict__)
        except EOFError:
            break

python入门之模块——第2关:内置模块中的内置函数(代码片段)

任务描述我们在安装好了Python配置文件后,也将Python本身带有的库也安装好了,Python自带的库也叫做Python的内置模块。Python的内置模块是Python编程的重要组织形式,内置模块中的内置函数也极大方便了编程过程中对函... 查看详情

python3入门(十三)——常用内置模块之时间日期模块datatime(代码片段)

1.日期时间模块——datatime  //其他模块例如time、calender等模块暂不展开(1)获取当前时间:datatime.now(): fromdatetimeimportdatetimenow=datetime.now()print(now) 结果:2019-06-0920:58:13.533006//如果仅仅使用import,则需要加全限 查看详情

python模块之-json

python模块jsonimport jsonx="[null,true,false,1]"print(json.loads(x)) #----------------------------序列化importjsondic={‘name‘:‘alvin‘,‘age‘:23,‘sex‘:‘male‘}print(type(dic))#<class‘dict‘>j=j 查看详情

python基础知识之json&pickle模块

...种简单的数据类型,我们可以直接使用Json来进行数据的序列化和反序列化:序列化dumps:importjsonf=open("test.text","wb")f.write(json.dumps(info))f 查看详情

python3之序列化(pickle&json)

1、pickle模块python持久化的存储数据:python程序运行中得到了一些字符串,列表,字典等数据,想要长久的保存下来,方便以后使用,而不是简单的放入内存中关机断电就丢失数据。python模块大全中pickle模块就排上用场了,他可... 查看详情

python3----模块(序列化(json&pickle)+xml+requests)

一、序列化模块Python中用于序列化的两个模块:json  跨平台跨语言的数据传输格式,用于【字符串】和 【python基本数据类型】 间进行转换pickle python内置的数据传输格式,多用于二进制形式,用于【python特有... 查看详情

十内置模块(代码片段)

一、json&pickle1.什么是序列化序列化就是将内存中的数据类型转成另外一种格式即:字典---------序列化--------->其他的格式--------------->存到硬盘硬盘---读取---->其他格式----------反序列化-------->字典2.为什么要序列化1.持久... 查看详情

json模块

...符串表达式,并返回表达式的值eavl的用法:二、什么是序列化我们把对象(变量)从内存中变成可存储或传输的过程称之为序列化,在Pyt 查看详情

python之模块(代码片段)

模块即一推代码的集合来实现某个功能,使用时直接调用,甚是方便。模块又分为三种自定义模块内置模块第三方模块下面就来介绍介绍什么是内置模块及如何去使用它和内置模块的好处。使用模块模块前首先导入该模块,才能... 查看详情

python的json模块的dumps,loads,dump,load方法介绍

load和loads都是实现“反序列化”,区别在于(以Python为例):loads针对内存对象,即将Python内置数据序列化为字串如使用json.dumps序列化的对象d_json=json.dumps({‘a‘:1,‘b‘:2}),在这里d_json是一个字串‘{"b":2,"a":1}‘d=json.loads(d_json)&n... 查看详情

day5常用模块json和pickle

json和 pickle   json和pickle是用于字符串序列化和反序列化的过程,我们在存储和使用的时候,经常把列表存入文件,读取的时候我们还想以列表的形式读取。就需要使用json和pickle。json是支持所有的接口,pickle是pytho... 查看详情

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

一、json&pickle&shelve模块json,用于字符串和python数据类型间进行转换pickle,用于python特有的类型和python的数据类型间进行转换Json模块提供了四个功能:dumps、dump、loads、loadpickle模块提供了四个功能:dumps、dump、loads、loadjson... 查看详情

python的json模块

...解析和生成,Json是JavaScript中的一个子集。python的json模块序列化与反序列化的过程分别是encoding和decoding。encoding:把一个python对象编码转换成Json字符串。decoding:把json格式字符串编码转换 查看详情

python中difflib内置模块之文本对比

什么是difflib?用来做什么?difflib为python的标准库模块,无需安装。作用时对比文本之间的差异。并且支持输出可读性比较强的HTML文档,与Linux下的diff命令相似。在版本控制方面非常有用。符号理解符号含义‘-‘包含在第一个系列... 查看详情

序列化模块

...json.loads吧字符串转换成Python的基本数据类型,,通过json饭序列化时一定记得里面是双引号。2.通过模块json.dumps吧python基本数据类型转换成字符串。3.通过json。dump吧Python基本数据类型转换成字符串并写入一个文件里面。4.在文件里... 查看详情

python之json模块

  importjsondata={"no":1,"name":"Runoob","url":"http://www.runoob.com"}json_str=json.dumps(data)#json.dumps()函数对数据进行编码,将其转换成为json格式的数据print("python原始数据:",repr(data))print("pythonjson数据:",json_str)pyth 查看详情

python-json&pickle模块(序列化模块)

什么叫序列化?就是把内存里的数据存到硬盘上。为什么要把了内存里的数据存在硬盘上?1.程序在运行,关闭了,内存数据丢失。2.下次程序再启动,再从硬盘上读回来,还是原来的格式的话,那是极好的。3.内存里的数据多为... 查看详情

第五周-第06章节-python3.5-内置模块详解之range模块

如果你对在Python生成随机数与random模块中最常用的几个函数的关系与不懂之处,下面的文章就是对Python生成随机数与random模块中最常用的几个函数的关系,希望你会有所收获,以下就是这篇文章的介绍。random.random()用于生成用于... 查看详情