知行编程网知行编程网  2023-01-05 21:30 知行编程网 隐藏边栏  4 
文章评分 0 次,平均分 0.0
导语: 本文主要介绍了关于一文了解Python序列化的相关知识,包括python对象序列化,以及python中序列和列表区别这些编程知识,希望对大家有参考作用。

一文看懂Python序列化

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



1.pickle序列化

Python提供了pickle模块来实现变量的序列化。该模块可以将变量转换为字节码(字节)并存储,也可以将存储的序列化字节码恢复为数据对象;

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


a.pickle普通对象序列化

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

#!/usr/bin/env python3
#coding=utf-8
import os
import pickle
#创建一个字典对象和一个字符串对象
d=dict(one=1,two=2,three=3)
s="python"
print(d) #输出{'three': 3, 'two': 2, 'one': 1}
print(s) #输出
 
#将这两个对象序列化,nd和ns仅保存在内存中,可用于网络传输
nd=pickle.dumps(d)
ns=pickle.dumps(s)
print(nd) #输出字节码"b'\x80\x03}q\x00...."
print(ns) #输出字节码"b'\x80\x03X\x11...."
 
#将序列化后的对象重新还原成数据(假设接收端接收到这些数据后,就能够这样还原)
nd=pickle.loads(nd)
ns=pickle.loads(ns)
print(nd) #输出{'three': 3, 'two': 2, 'one': 1}
print(ns) #输出
 
#创建一个文件testfile,接收字节码(wb),将d对象中的数据写入其中,
#用于本地不同应用程序之间数据交换(此时如果我们打开testfile文件,
#就会看到一些类似乱码一样的字符,实际上是d对象序列化后的数据)
with open("testfile","wb") as f1:
    pickle.dump(d,f1)
 
#从testfile文件中读取字节码,还原成数据
if os.path.isfile("testfile"):
    with open("testfile","rb") as f2:
        print(f2.read()) #输出"b'\x80\x03}q\x0...."
#因为上一步读取了数据,指针位置要重新设置成起始位置,
#这仅仅是为了演示给大家看,上面print和seek这两句可以不写
        f2.seek(0)
        d=pickle.load(f2) #读取f2中的数据还原
        print(d) #输出{'three': 3, 'two': 2, 'one': 1}

总结:只能在内存中序列化和恢复,使用dumps()和loads(),使用dump()序列化数据保存到文件,使用load()从文件恢复数据,两者只有一个s区别,注意不要混淆。


b.pickle类序列化

有时我们可能希望传输或保存一个类对象及其中的所有数据。在python中实现类的序列化非常简单,和对象序列化没什么区别。请看下面的例子:

#!/usr/bin/env python3
#coding=utf-8
import pickle
########
class A:
    #--------
    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__.A object at 0x7f43c995c080>"
 
#将类对象序列化后保存到磁盘文件中,可用于程序间数据交换
with open("testfile","wb") as f1:
    pickle.dump(x,f1)
 
#读取文件中的数据还原
with open("testfile","rb") as f1:
    y=pickle.load(f1)
print(y.name) #输出"晴刃"
print(y.website) #输出



2.json序列化

如果你想在不同的编程语言之间传递对象,你可以使用python的json模块来序列化数据。 json序列化之后,所有的数据都会被表示为字符串,所有语言都可以读取,也可以方便的存储。到磁盘或通过网络传输,但在转换类数据时会有点麻烦,不如pickle方便。


a.json普通对象序列化

#!/usr/bin/env python3
#coding=utf-8
import json
 
#创建一个字典对象和一个浮点数对象
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文件中
with open("testfile","w") as f1:
    json.dump(d,f1)
 
#从testfile文件中读取数据并还原
with open("testfile","r") as f1:
    y=json.load(f1)
    print(type(y)) #<class 'dict'>


b.json类序列化

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

#!/usr/bin/env python3
#coding=utf-8
import json
 
class A(object):
    def __init__(self,name="py",website="python"):
        self.name=name
        self.website=website
#初始化一个类实例
a=A()
 
#创建一个函数,将类A中的对象和数据转换成字典的形式返回
def  classA2dict(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=lambda obj:obj.__dict__)
 
print(type(x)) #<class 'str'>
print(x) #"{"website": "python", "name": "py"}"
 
#字典类型转换成类返回
def dict2classA(d):
    return A(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中
with open("testfile","w") as f1:
    json.dump(a,f1,default=classA2dict)
#读取testfile中的数据还原
with open("testfile","r") as f2:
    y=json.load(f2,object_hook=dict2classA)
    print(y.name)

众多
视频,尽在python学习网,欢迎在线学习!

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

本文为原创文章,版权归所有,欢迎分享本文,转载请保留出处!

知行编程网
知行编程网 关注:1    粉丝:1
这个人很懒,什么都没写
扫一扫二维码分享