iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python中怎么实现序列化与反序列化
  • 333
分享到

Python中怎么实现序列化与反序列化

2023-06-15 10:06:25 333人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

这篇文章给大家介绍python中怎么实现序列化与反序列化,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。Python序列化与反序列在程序运行的过程中,所有的变量都是在内存中,比如,定义一个 dict:d =&n

这篇文章给大家介绍python中怎么实现序列化与反序列化,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

Python序列化与反序列

在程序运行的过程中,所有的变量都是在内存中,比如,定义一个 dict:

d = dict(name='Bob', age=20, score=88)

可以随时修改变量,比如把 name 改成 ‘Bill',但是一旦程序结束,变量所占用的内存就被操作系统全部回收。如果没有把修改后的 ‘Bill' 存储到磁盘上,下次重新运行程序,变量又被初始化为 ‘Bob'。

我们把变量从内存中变成可存储或传输的过程称之为序列化,在 Python 中叫 pickling,在其他语言中也被称之为 serialization,marshalling,flattening 等等,都是一个意思。
序列化之后,就可以把序列化后的内容写入磁盘,或者通过网络传输到别的机器上。

Python中怎么实现序列化与反序列化

反过来,把变量内容从序列化的对象重新读到内存里称之为反序列化,即 unpickling。

Python 提供了 pickle 模块来实现序列化。首先,我们尝试把一个对象序列化并写入文件:

In [1]: import pickleIn [2]: d = dict(name='Bob', age=20, score=88)In [3]: pickle.dumps(d)Out[3]: b'\x80\x04\x95$\x00\x00\x00\x00\x00\x00\x00}\x94(\x8c\x04name\x94\x8c\x03Bob\x94\x8c\x03age\x94K\x14\x8c\x05score\x94KXu.'

pickle.dumps() 方法把任意对象序列化成一个 bytes,然后,就可以把这个 bytes 写入文件。或者用另一个方法 pickle.dump() 直接把对象序列化后写入一个 file-like Object:

In [5]: f = open('dump.txt', 'wb')In [6]: d = dict(name='Bob', age=20, score=88)In [7]: pickle.dump(d, f)In [8]: f.close()

看看写入的 dump.txt 文件,一堆乱七八糟的内容,这些都是 Python 保存的对象内部信息。

Python中怎么实现序列化与反序列化

当我们要把对象从磁盘读到内存时,可以先把内容读到一个 bytes,然后用 pickle.loads() 方法反序列化出对象,也可以直接用 pickle.load() 方法从一个 file-like Object 中直接反序列化出对象。我们打开另一个 Python 命令行来反序列化刚才保存的对象:

In [23]: f = open('dump.txt', 'rb')In [24]: d = pickle.load(f)In [25]: f.close()In [26]: dOut[26]: {'name': 'Bob', 'age': 20, 'score': 88}

变量的内容又回来了!

当然,这个变量和原来的变量是完全不相干的对象,它们只是内容相同而已。

Pickle 的问题和所有其他编程语言特有的序列化问题一样,就是它只能用于 Python,并且可能不同版本的 Python 彼此都不兼容,因此,只能用 Pickle 保存那些不重要的数据,不能成功地反序列化也没关系。

JSON

如果我们要在不同的编程语言之间传递对象,就必须把对象序列化为标准格式,比如 XML,但更好的方法是序列化为 jsON,因为 JSON 表示出来就是一个字符串,可以被所有语言读取,也可以方便地存储到磁盘或者通过网络传输。JSON 不仅是标准格式,并且比 XML 更快,而且可以直接在 WEB 页面中读取,非常方便。

JSON 表示的对象就是标准的 javascript 语言的对象,JSON 和 Python 内置的数据类型对应如下:

JSON类型Python类型
{}dict
[]list
“string”str
1234.56int 或 float
true/falseTrue/False
nullNone

Python 内置的 json 模块提供了非常完善的 Python 对象到 JSON 格式的转换。我们先看看如何把 Python对象变成一个 JSON:

In [27]: import jsonIn [28]: d = dict(name='Bob', age=20, score=88)In [29]: json.dumps(d)Out[29]: '{"name": "Bob", "age": 20, "score": 88}'In [30]: type(json.dumps(d))Out[30]: str

dumps() 方法返回一个 str,内容就是标准的 JSON。类似的,dump() 方法可以直接把 JSON 写入一个 file-like Object。

要把 JSON 反序列化为 Python 对象,用 loads() 或者对应的 load() 方法,前者把 JSON 的字符串反序列化,后者从 file-like Object 中读取字符串并反序列化:

In [31]: json_str = '{"age": 20, "score": 88, "name": "Bob"}'In [32]: json.loads(json_str)Out[32]: {'age': 20, 'score': 88, 'name': 'Bob'}In [33]: type(json.loads(json_str))Out[33]: dict

由于 JSON 标准规定 JSON 编码是 UTF-8,所以我们总是能正确地在 Python 的 str 与 JSON 的字符串之间转换。

JSON 进阶

Python 的 dict 对象可以直接序列化为 JSON 的 {},不过,很多时候,我们更喜欢用 class . 表示对象,比如定义 Student 类,然后序列化:

import jsonclass Student(object):    def __init__(self, name, age, score):        self.name = name        self.age = age        self.score = scores = Student('Bob', 20, 88)print(json.dumps(s))

运行代码,毫不留情地得到一个 TypeError:

Traceback (most recent call last):  ...TypeError: Object of type Student is not JSON serializable

错误的原因是 Student 对象不是一个可序列化为 JSON 的对象。

如果连 class 的实例对象都无法序列化为 JSON,这肯定不合理!

别急,我们仔细看看 dumps() 方法的参数列表,可以发现,除了第一个必须的 obj 参数外,dumps() 方法还提供了一大堆的可选参数:https://docs.python.org/3/library/json.html#json.dumps

这些可选参数就是让我们来定制 JSON 序列化。前面的代码之所以无法把 Student 类实例序列化为 JSON,是因为默认情况下,dumps() 方法不知道如何将 Student 实例变为一个 JSON 的 {} 对象。

可选参数 default 就是把任意一个对象变成一个可序列为 JSON 的对象,我们只需要为 Student 专门写一个转换函数,再把函数传进去即可:

In [40]: s.nameOut[40]: 'Bob'In [41]: s.ageOut[41]: 20In [42]: s.scoreOut[42]: 88
def student2dict(std):    return {        'name': std.name,        'age': std.age,        'score': std.score    }

这样,Student 实例首先被 student2dict() 函数转换成 dict,然后再被顺利序列化为 JSON:

print(json.dumps(s, default=student2dict))

不过,下次如果遇到一个 Teacher 类的实例,照样无法序列化为 JSON。再写一个函数 也可以,但是我们可以偷个懒,把任意 class 的实例变为 dict:

print(json.dumps(s, default=lambda obj: obj.__dict__))

因为通常 class 的实例都有一个 __dict__ 属性,它就是一个 dict,用来存储实例变量。也有少数例外,比如定义了 __slots__ 的 class。

同样的道理,如果我们要把 JSON 反序列化为一个 Student 对象实例,loads() 方法首先转换出一个 dict 对象,然后,我们传入的 object_hook 函数负责把 dict 转换为 Student 实例:

def dict2student(d):    return Student(d['name'], d['age'], d['score'])

运行结果如下:

In [48]: json_str = '{"age": 20, "score": 88, "name": "Bob"}'In [49]: def dict2student(d):    ...:     return Student(d['name'], d['age'], d['score'])    ...:In [50]: print(json.loads(json_str, object_hook=dict2student))<__main__.Student object at 0x1065c6f70>

打印出的是反序列化的 Student 实例对象。

练习

对中文进行 JSON 序列化时,json.dumps() 提供了一个 ensure_ascii 参数,观察该参数对结果的影响:

import jsonobj = dict(name='小明', age=20)s = json.dumps(obj, ensure_ascii=True)print(s)

关于Python中怎么实现序列化与反序列化就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

--结束END--

本文标题: Python中怎么实现序列化与反序列化

本文链接: https://www.lsjlt.com/news/279616.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Python中怎么实现序列化与反序列化
    这篇文章给大家介绍Python中怎么实现序列化与反序列化,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。Python序列化与反序列在程序运行的过程中,所有的变量都是在内存中,比如,定义一个 dict:d =&n...
    99+
    2023-06-15
  • Java序列化与反序列化怎么实现
    本篇内容主要讲解“Java序列化与反序列化怎么实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java序列化与反序列化怎么实现”吧!序列化与反序列化概念序列化 (Serialization)是...
    99+
    2023-06-02
  • Java的序列化与反序列化怎么实现
    本篇内容介绍了“Java的序列化与反序列化怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Java对象的序列化Java平台允许我们在内...
    99+
    2023-07-04
  • C#实现XML序列化与反序列化
    目录一、使用 System.Xml.Serialization类1、定义元数据2、简单序列化与反序列化3、集合的序列化与反序列化4、在不能更改数据的情况下,可以用代码重载 XmlAt...
    99+
    2024-04-02
  • 序列化与反序列化
    序列化(pickling)   把变量从内存中变成可存储或传输的过程 反序列化(unpickling)   把变量内容从序列化的对象重新读到内存里的过程 序列化&反序列化的意义  在程序运行过程中,对象可在内存中被自由的修改  一...
    99+
    2023-01-31
    序列 化与 序列化
  • 怎么在python中使用序列化与反序列化
    这篇文章将为大家详细讲解有关怎么在python中使用序列化与反序列化,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。python有哪些常用库python常用的库:1.requesuts;2.s...
    99+
    2023-06-14
  • Java序列化与反序列化
    目录Java 序列化与反序列化序列化APIObjectOutputStreamObjectInputStreamserialVersionUIDTransient (瞬态变量)实例理...
    99+
    2023-05-14
    Java序列化 Java反序列化
  • 如何在Java中实现序列化与反序列化
    本篇文章给大家分享的是有关如何在Java中实现序列化与反序列化,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Java可以用来干什么Java主要应用于:1. web开发;2. A...
    99+
    2023-06-14
  • 【反序列化漏洞-01】序列化与反序列化概述
    为什么要序列化 百度百科上关于序列化的定义是,将对象的状态信息转换为可以存储或传输的形式(字符串)的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区(非关系型键值对形式的数据库Redis,与数组类似)。以后,可以通过从存储区中...
    99+
    2023-09-06
    web安全 安全 反序列化 序列化 PHP反序列化漏洞 Powered by 金山文档
  • Json字符串的序列化与反序列化怎么实现
    今天小编给大家分享一下Json字符串的序列化与反序列化怎么实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们...
    99+
    2024-04-02
  • Java序列化与反序列化怎么应用
    这篇“Java序列化与反序列化怎么应用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Java序列化与反序列化怎么应用”文章吧...
    99+
    2023-07-05
  • JavaScript中怎么用JSON来序列化与反序列化
    小编给大家分享一下JavaScript中怎么用JSON来序列化与反序列化,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!用JSON...
    99+
    2024-04-02
  • Python开发之序列化与反序列化:pi
      在日常开发中,所有的对象都是存储在内存当中,尤其是像python这样的坚持一切接对象的高级程序设计语言,一旦关机,在写在内存中的数据都将不复存在。另一方面,存储在内存够中的对象由于编程语言、网络环境等等因素,很难在网络中进行传输交互...
    99+
    2023-01-30
    序列 化与 序列化
  • Python中序列化与反序列化的示例分析
    这篇文章将为大家详细讲解有关Python中序列化与反序列化的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。初识序列化与反序列化什么是序列化?通俗一点来说,序列化就是将 对象的信息 或者 数据结构的...
    99+
    2023-06-29
  • 序列化与反序列化如何在java项目中实现
    序列化与反序列化如何在java项目中实现 ?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。 1.Java序列化与反序列化 Java序列化是指把...
    99+
    2023-05-31
    java 序列化 反序列化
  • Java中如何实现序列化和反序列化
    本篇文章给大家分享的是有关Java中如何实现序列化和反序列化,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。序列化序列化:将对象转换为二进制序列在网络中传输或保存到磁盘反序列化:...
    99+
    2023-06-15
  • Java中怎么实现对象的序列化和反序列化
    这篇文章给大家分享的是有关Java中怎么实现对象的序列化和反序列化的内容。小编觉得挺实用的,因此分享给大家做个参考。一起跟随小编过来看看吧。引言:序列化是将对象的状态信息转换为可以存储或传输的形式的过程,在...
    99+
    2024-04-02
  • C#如何实现序列化和反序列化
    这篇文章给大家分享的是有关C#如何实现序列化和反序列化的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。.net下有一种技术叫做对象序列化,说得通俗一点,C#序列化就是把一个对象保存到一个文件或数据库字段中去,C#反...
    99+
    2023-06-17
  • JavaIO之序列化与反序列化详解
    目录1、什么是序列化与反序列化?2、为什么要做序列化?3、Java 怎么进行序列化?总结1、什么是序列化与反序列化? 序列化:指把堆内存中的 Java 对象数据,通过某种方式把对象存...
    99+
    2024-04-02
  • 怎么减少Redis序列化与反序列化开销
    要减少Redis序列化与反序列化开销,可以尝试以下几种方法: 使用更轻量级的序列化方式:选择合适的序列化方式可以减少序列化与反序...
    99+
    2024-04-29
    Redis
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作