python pickle反序列化,

  python pickle反序列化,

  本文主要介绍Python中两个常用的序列化模块:pickle序列化和json序列化。本文中的样例代码讲解的很详细,感兴趣的朋友可以学习一下。

  00-1010序列化和反序列化序列化模块使用场景dumps loadsdump loadjson序列化模块使用场景支持的数据类型json和pickle有区别的序列化函数json和pickle实际使用中的一些问题pickle和JSON的区别总结

  

目录

 

  进口泡菜

  

序列化模块

 

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

  文件中存储的数据只能是字符串或字节流,不能是其他数据类型,但是如果要存储的话需要序列化。

  Python中的序列化模块叫pickle,PHP等语言叫它serialize或者deserialize,每种语言的序列化函数都可以序列化自己所有的数据类型。

  

序列化和反序列化

 

  现在有一个数据,我现在不需要它,但也许有一天我会用到它,所以最好的办法就是保存它。

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

  如下图:保存文件会有各种各样的麻烦。

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

  lst=[A , B , C]

  #不能使用open函数直接将非字符串和非字节流数据写入文件。

  用open(data.txt , w ,编码=UTF-8 )作为fp :

  浮点写入(lst)

  # !异常

  #将数据更改为字符串会破坏原始数据结构(如果复杂的数据结构恢复的可能性很小)

  lst=str(lst)

  #将数据转换成字节流:只有字符串可以转换成字节流数据!

  现在您可以使用序列化函数将数据序列化为字节流格式,然后将其存储在文件中。必要时可以从文件中读取,然后反序列化成原始数据,并保证原始数据的数据结构不变。

  它可以序列化语言中的任何数据类型,也就是说,不仅可以序列化基本数据类型,还可以序列化函数、类、对象.

  

使用场景

 

  转储将任何对象序列化为字节数据,加载将序列化为字节的数据反序列化为原始数据格式。

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

  进口泡菜

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

  lst=[A , B , C]

  # dumps将任何对象序列化为字节。

  res=pickle.dumps(lst)

  print(RES)# b X80 x03]q x00(X x01 x00 x00Aq x01X x01 x00 x00Bq x02X x01 x00 x00Cq x03e

  print(type(res)) # class bytes

  #可将序列化字节数据写入文件。

  # loads将任何字节反序列化到原始数据中

  lst=pickle.loads(res)

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

  print(type(lst)) # class list

  #尝试反序列化其他字节数据

  Char=你好

  bychar=char

  .encode()

  new_char = pickle.loads(by_char) # _pickle.UnpicklingError: invalid load key, xe4.

  

  

 

  

dump & load

 

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

  

import pickle

 

  

 

  

JSON序列化模块

 

  import json

  

使用场景

 

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

  每种语言虽然各有自己的特点,但是几乎所以的语言都是师出同门,天下语言无不出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数据然后强转成为字符串;

  

import json

 

  

 

  

JSON和pickle的区别

 

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

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

  

 

  

序列化函数

 

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

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

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

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

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

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

  

import json

 

  

 

  

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

 

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

  

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

  • pickle可以连续dump和load

 

  如下解释:

  

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

 

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

  再来看pickle是怎么样的:

  

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

 

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

  怎么解决json的这个问题?

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

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

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

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

  

import json

 

  

 

  

pickle和json的区别总结

 

  json序列化后的数据为字符串,pickle序列化后的数据为字节流;

  json支持八种数据类型(int、float、bool、str、list、tuple、dict、None),pickle支持python的一切数据类型;

  json一般用于多语言间的数据交流,pickle一般用于python之间数据交流;

  以上就是Python序列化模块之pickle与json详解的详细内容,更多关于Python pickle json的资料请关注盛行IT软件开发工作室其它相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: