Python常用标准库详解(pickle序列化和JSON序列化)_第1页
Python常用标准库详解(pickle序列化和JSON序列化)_第2页
Python常用标准库详解(pickle序列化和JSON序列化)_第3页
Python常用标准库详解(pickle序列化和JSON序列化)_第4页
Python常用标准库详解(pickle序列化和JSON序列化)_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第Python常用标准库详解(pickle序列化和JSON序列化)目录常用的标准库序列化模块序列化和反序列化使用场景dumpsloadsdumploadJSON序列化模块使用场景支持的数据类型JSON和pickle的区别序列化函数json和pickle实际使用过程中的一些问题pickle和json的区别总结

常用的标准库

序列化模块

importpickle

序列化和反序列化

把不能直接存储的数据变得可存储,这个过程叫做序列化。把文件中的数据拿出来,回复称原来的数据类型,这个过程叫做反序列化。

在文件中存储的数据只能是字符串,或者是字节流,不能是其它的数据类型,但是如果想要将其存储就需要序列化。

Python中的序列化模块叫做pickle,PHP等其它的一些语言将其称作serialize或者unserialize,每个语言的序列化功能可以序列化它本身的一切数据类型。

使用场景

现在存在一段数据,现在并不需要他,但是说不定什么时候我就要用它,那么最好的方法就是将这段数据保存起来。

保存这段数据一般来说有那么几种方法(入库或者保存文件),但是这段数据很复杂,而保存在数据库中需要特定的数据格式,入库的话就非常的麻烦了,而且我不想破坏数据的原有格式,那么可以选择保存为文件。

如下所示:保存文件会遇到种种的麻烦问题。

lst=[A,B,C]

withopen(data.txt,w,encoding=UTF-8)asfp:

fp.write(lst)

lst=str(lst)

现在就可以使用序列化功能,将数据序列化成为字节流的格式,然后存在文件当中,当需要的时候,再从文件中读取出来,然后反序列化成为数据原来的样子,而且保证原数据的数据结构没有变化。

而且可以序列化语言当中的任何数据类型,就是说不止是基本的数据类型,还有函数、类、对象

dumpsloads

dumps将任意对象序列化成bytes数据,loads将序列化成为bytes的数据反序列成数据原本的格式。

注意:只能反序列化被序列化的数据

importpickle

#这是我想要保存的一段数据

lst=['A','B','C']

#dumps把任意对象序列化成bytes

res=pickle.dumps(lst)

print(res)#b'\x80\x03]q\x00(X\x01\x00\x00\x00Aq\x01X\x01\x00\x00\x00Bq\x02X\x01\x00\x00\x00Cq\x03e.'

print(type(res))#class'bytes'

#序列化后的bytes数据可以写入文件中。

#loads把任意bytes反序列化成为原来的数据

lst=pickle.loads(res)

print(lst)#['A','B','C']

print(type(lst))#class'list'

#尝试反序列化其它的bytes数据

char='你好'

by_char=char.encode()

new_char=pickle.loads(by_char)#_pickle.UnpicklingError:invalidloadkey,'\xe4'.

dumpload

含义和上述的相同,只是这个可以直接操作IO对象,省时省力。

importpickle

#这是我想要保存的一段数据

lst=['A','B','C']

#dumps和loads配合文件操作

#序列化后写入文件

withopen('test.txt','wb')asfp:

data=pickle.dumps(lst)

fp.write(data)

#读取文件反序列化

withopen('test.txt','rb')asfp:

data=fp.read()

lst=pickle.loads(data)

#dump和load配合文件操作

#序列化写入文件

withopen('test.txt','wb')asfp:

pickle.dump(lst,fp)

#读取文件反序列化

withopen('test.txt','rb')asfp:

lst=pickle.load(fp)

JSON序列化模块

importjson

序列化后的数据,如果想在多种语言中都可以流通怎么办?每种语言都有自己的语言特性,有些语言中的数据是特有的,那么序列化后的数据该怎么流通呢?

每种语言虽然各有自己的特点,但是几乎所以的语言都是师出同门,天下语言无不出C者。所以将每种语言共同存在的数据格式按照统一的标准去序列化就可以了,JSON诞生了。

json一般存储为json文件。

支持的数据类型

python中支持JSON序列化的数据一共有八种类型:

int、float、bool、str、list、tuple、dict、None

JSON序列化支持这几种数据类型是因为JSON中就只支持这几种数据类型:

如下为python中的数据类型对应json中的数据类型;

python数据类型JSON数据类型intintfloatfloatbool(True,False)bool(true,false)Nonenullstrstr(必须双引号)list([])、tuple(())Array([])dict({})Object({})(键必须是双引号)

注意:

JSON中没有元组类型,所以会变成列表;JSON中的对象必须使用字符串作为键,所以python中的字典数据中的非字符串键,会变成对应的JSON数据然后强转成为字符串;

importjson

dict_var={1:1,2.2:2.2,False:True,'123':'123',"234":"234",None:None}

json_obj=json.dumps(dict_var)

dict_var=json.loads(json_obj)

print(dict_var)

#{'1':1,'2.2':2.2,'false':True,'123':'123','234':'234','null':None}

JSON和pickle的区别

JSON可以序列化python八种数据,序列化为字符串。

pickle可以序列化python所有的数据类型,序列化为字节流。

序列化函数

JSON序列化函数和pickle的一样,名称和使用方法基本一样:

方法含义dumps序列化loads反序列化dump序列化写入文件load读取文件反序列化

这里注意一下序列化方法的几个常用参数:

ensure_asscii默认为True,以ACSII格式编码,以Unicode显示;

sort_keys默认为True,对字典的键进行排序;

indent默认为None,json格式化默认是一行不加缩进的,如果indent是一个正整数,就以该缩进级别进行换行,增强可视化。

importjson

#开启排序

dict_var={'B':'2','A':'1'}

print(dict_var)#{'B':'2','A':'1'}

json_char=json.dumps(dict_var,ensure_ascii=False,sort_keys=True)

dict_var=json.loads(json_char)

print(dict_var)#{'A':'1','B':'2'}

#关闭排序

dict_var={'B':'2','A':'1'}

print(dict_var)#{'B':'2','A':'1'}

json_char=json.dumps(dict_var,ensure_ascii=False,sort_keys=False)

dict_var=json.loads(json_char)

print(dict_var)#{'B':'2','A':'1'}

#dump也一样哦

json和pickle实际使用过程中的一些问题

在对文件进行操作的时候:

json可以连续dump,但是不能连续loadpickle可以连续dump和load

如下解释:

#json可以连续dump,但是不能连续load

importjson

#序列化数据

lst1=[1,2,3]

lst2=[4,5,6]

lst3=[7,8,9]

#序列化写入文件

withopen('test.json','w',encoding='UTF-8')asfp:

json.dump(lst1,fp)

json.dump(lst2,fp)

json.dump(lst3,fp)

#读取文件反序列化

withopen('test.json','r',encoding='UTF-8')asfp:

data1=json.load(fp)#ERROR

data2=json.load(fp)

data3=json.load(fp)

#!!!json.decoder.JSONDecodeError:Extradata:line1column10(char9)

因为json.dump方法序列化写入文件的时候,写入了两个及以上的数据,之后json.load方法在读的时候又是一次性将整个文件中的数据读取出来,这个时候,反序列化的数据成了[1,2,3][4,5,6][7,8,9],这明显不是一个json支持的数据格式,所以json.load失败了。

再来看pickle是怎么样的:

#pickle可以连续dump,也可以连续load

importpickle

#序列化数据

lst1=[1,2,3]

lst2=[4,5,6]

lst3=[7,8,9]

#序列化写入文件

withopen('pickle.txt','wb')asfp:

pickle.dump(lst1,fp)

pickle.dump(lst2,fp)

pickle.dump(lst3,fp)

#读取文件反序列化

withopen('pickle.txt','rb')asfp:

data1=pickle.load(fp)#[1,2,3]

print(data1)

data2=pickle.load(fp)#[4,5,6]

print(data2)

data3=pickle.load(fp)#[7,8,9]

print(data3)

#尝试先逐行读取,再反序列化

withopen('pickle.txt','rb')asfp:

datum=fp.readlines()

print(len(datum))#1

fordataindatum:

data=pickle.loads(data)

print(data)#[1,2,3]#只能读出一个

可以看到pickle.load将数据都读出来了,这是因为pickle.dump在写入数据的时候在每条数据后都加上了一个标记(有些人解释说是换行,但是文件中并没有换行,逐行使用fp.readlines逐行读取的时候也只能获取一条,但是在文件中所有的数据都是在同一行的,我也不太懂了(无奈)),然后pickle.load每次就只会读一条数据,从IO指针读到每条数据后的那个标记为止,所以,pickle可以连续的load。

怎么解决json的这个问题?

其实上面的这个问题,我个人认为是一种不规范的操作。因为json.load会一次性的读取整个文件中的内容,你却在一个文件中写入了不止一条的数据,那么在反序列化的时候当然会报错了。所以我认为:

json的主要作用多语言之前的数据传递和数据存储,每个JSON文件中最好只储存一条完整的数据。

但是我就想在一个json文件中存多个数据呢?

其实思路很简单,关键就是读取文件然后反序列化的时候,必须是一条数据、一条数据的反序列化,类似如下:

importjson

#序列化数据

lst1=[1,2,3]

lst2=[4,5,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论