序列化和反序列化python,python中序列化和反序列化

  序列化和反序列化python,python中序列化和反序列化

  当程序运行时,所有变量都存储在内存中。程序运行完毕,占用的内存会被系统回收,不能长时间存储。将这些变量转换成可存储或可通过网络传输的过程称为酸洗。序列化后,它们可以存储在磁盘上或通过网络传输。

  1.pickle序列化

  Python提供了pickle模块来实现变量的序列化。这个模块可以将变量转换成字节并存储,也可以将存储的序列化字节还原成数据对象。

  注意:pickle只能用于python程序之间的数据交换,不同版本不兼容。当你需要和其他程序通信时,请使用json序列化,它可以在不同的编程语言之间共享数据。

  a.pickle普通对象序列化

  我们来看一个小例子。使用pickle模块,几个不同的对象被序列化。这些序列化对象可用于网络传输或存储在磁盘文件中:

  #!/usr/bin/envpython3

  #编码=utf-8

  进口货

  进口泡菜

  #创建一个字典对象和一个字符串对象

  d=字典(一=1,二=2,三=3)

  s=python

  Print(d)# output { 三 33603,二 33602,一 33601}

  打印数量输出

  #序列化这两个对象,nd和ns只保存在内存中,可以用于网络传输。

  nd=pickle.dumps(d)

  ns=pickle.dumps

  Print(nd)#输出字节码 b\x80\x03}q\x00.

  Print(ns)#输出字节码 b\x80\x03X\x11.

  #将序列化的对象再次还原为数据(假设接收方在接收到数据后可以这样还原)

  nd=酸洗负载(nd)

  ns=酸洗负载(ns)

  Print(nd)# output { 三 33603,二 33602,一 33601}

  打印(纳秒)#输出

  #创建一个文件testfile,接收字节码(wb),并将D对象中的数据写入其中,

  #用于不同本地应用程序之间的数据交换(此时如果我们打开testfile文件,

  #你会看到一些类似乱码的字符,其实是D对象的序列化数据)

  withopen(testfile , wb)asf1:

  pickle.dump(d,f1)

  #从testfile文件中读取字节码,并将其恢复为数据。

  ifos . path . is file( test file ):

  withopen(testfile , rb)asf2:

  print(F2 . read())# output b \ X80 \ x03 } q \ x0.

  #因为数据是在前一步骤中读取的,所以指针位置应该被重置到起始位置,

  #这只是给你看,上面两句打印和寻找可以省略。

  f2.seek(0)

  D=pickle.load(f2)#读取f2中的数据恢复

  Print(d)# Output {three :3, two 33602, one 33601}摘要:仅在内存中序列化和还原,使用dumps()和loads(),使用dump()序列化数据并将其保存到文件中,使用load()从文件中还原数据。

  b.pickle类序列化

  有时我们可能想用

  其中所有的数据,python中实现类的序列化十分简单,与对象序列化没有什么区别,请看下面的实例:

  

#!/usr/bin/envpython3

  #coding=utf-8

  importpickle

  ########

  classA:

  #--------

  def__init__(self,name="py",website="python"):

  self.name=name

  self.website=website

  x=A()

  x.name="晴刃"

  

  #序列化类实例x,可用于网络传输

  nx=pickle.dumps(x)

  print(nx)#输出"b'\x80\x03c__main__...."

  

  #还原数据

  nx=pickle.loads(nx)

  print(nx)#输出"<__main__.Aobjectat0x7f43c995c080>"

  

  #将类对象序列化后保存到磁盘文件中,可用于程序间数据交换

  withopen("testfile","wb")asf1:

  pickle.dump(x,f1)

  

  #读取文件中的数据还原

  withopen("testfile","rb")asf1:

  y=pickle.load(f1)

  print(y.name)#输出"晴刃"

  print(y.website)#输出

2.json序列化

  如果要在不同的编程语言之间传递对象,可以使用python的json模块对数据进行序列化,json序列化后所有数据都被表示成字符串形式,可以被所有语言读取,也可以方便地存储到磁盘或者通过网络传输,但在类数据转换时会稍微有点麻烦,没有pickle那么方便。

  a.json普通对象序列化

  

#!/usr/bin/envpython3

  #coding=utf-8

  importjson

  

  #创建一个字典对象和一个浮点数对象

  d=dict(one=1,two=2,three=3)

  f=3.14

  

  print(type(d))#<class'dict'>

  print(type(f))#<class'float'>

  

  #普通对象的序列化与pickle相同

  nd=json.dumps(d)

  nf=json.dumps(f)

  

  #转换后所有对象都变成了字符串类型<class'str'>

  print(type(nd))

  print(type(nf))

  print(nd)#"{"three":3,"two":2,"one":1}"

  print(nf)#"3.14"

  

  #还原数据

  nd=json.loads(nd)

  nf=json.loads(nf)

  print(type(nd))#<class'dict'>

  print(type(nf))#<class'float'>

  

  #将d对象序列化后储存到testfile文件中

  withopen("testfile","w")asf1:

  json.dump(d,f1)

  

  #从testfile文件中读取数据并还原

  withopen("testfile","r")asf1:

  y=json.load(f1)

  print(type(y))#<class'dict'>

b.json类序列化

  使用json序列化类会稍显复杂,因为json的dump方法不知道如何将一个类转换成字符串,需要我们自己指定一个转换函数,请看下面的实例:

  

#!/usr/bin/envpython3

  #coding=utf-8

  importjson

  

  classA(object):

  def__init__(self,name="py",website="python"):

  self.name=name

  self.website=website

  #初始化一个类实例

  a=A()

  

  #创建一个函数,将类A中的对象和数据转换成字典的形式返回

  defclassA2dict(c):

  return{"name":c.name,"website":c.website}

  

  #将a使用json序列化,参数default告诉python解释器,将前面的对象a传递给后面的classA2dict函数处理,

  #classA2dict函数会返回一个字典类型,这个类型中包含了实例a中所有对象和数据的"键值对",

  #然后dumps函数将这个返回的字典类型序列化成字符串类型

  x=json.dumps(a,default=classA2dict)

  #如果想偷懒不写classA2dict函数,有一种简便方法,使用匿名函数,并且调用基类的__dict__函数,

  #这个函数会完成和classA2dict函数相同的功能,即将一个类的所有属性转换成字典"键值对"的形式

  #x=json.dumps(a,default=lambdaobj:obj.__dict__)

  

  print(type(x))#<class'str'>

  print(x)#"{"website":"python","name":"py"}"

  

  #字典类型转换成类返回

  defdict2classA(d):

  returnA(d["name"],d["website"])

  

  #将json序列后的数据还原成类,object_hook参数将x转换成字典类型,并传递给dict2classA函数处理,

  #dict2classA函数会读取这个字典中的每个键,将值传入A类进行初始化,返回一个类对象

  x=json.loads(x,object_hook=dict2classA)

  print(type(x))#<class'__main__.A'>

  print(x.website)

  

  #将序列化的类写入文件testfile中

  withopen("testfile","w")asf1:

  json.dump(a,f1,default=classA2dict)

  #读取testfile中的数据还原

  withopen("testfile","r")asf2:

  y=json.load(f2,object_hook=dict2classA)

  print(y.name)

众多python培训视频,尽在盛行IT软件开发工作室,欢迎在线学习!

  本文转自:https://www.jianshu.com/p/f4cfa19abca4

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

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