Python文件的应用之序列化与反序列化详解

目录
  • 初识序列化与反序列化
    • 什么是序列化?
    • 可序列化的数据类型
  • Python 中的json
    • dumps() 与 loads() 函数
    • 可序列化数据类型演示案例
    • bool 、None 类型的序列化与反序列化
  • Python 中的pickle
    • dumps() 与 loads() 函数
    • pickle模块的序列化与反序列化练习
  • json 模块 - 序列化小实战

前面章节我们学些了文件对象的创建、写入与读取,并且针对 .py 文件 与 .txt 文件进行了有针对性的小练习。 通过前面的学习我们知道,文件对象的读写只能进行 字符串 或 byte 类型的操作,其他类型只能通过格式化存储或者数据类型的转换才能实现。

但无论是哪一种,从文件中读取数据后都需要进行比较复杂的处理才能还原到原始的数据类型。为了简化数据类型的写入和获取,今天我们来学习一个新的知识点 —> 序列化。

通过学习序列化,可以不必过分担心写入文件的数据类型是什么,并且读取文件也可以非常轻松的还原数据类型。[比较讨厌这种每章之前写概述、摘要的短句。]

初识序列化与反序列化

什么是序列化?

通俗一点来说,序列化就是将 对象的信息 或者 数据结构的信息 通过一定的规则进行转换,可以达到 文件存储 或 网络传输 的效果。通过前面章节的学习,我们知道如果要进行存储或网络传输,最终的数据类型都是 字符串,而且这些字符串还需要是有一定规则的字符串。

而我们今天要学习的 内置模块 ---> json 可以用于文件存储或者网络传输,这也是序列化的作用。

而反序列化就是通过序列化规则生成的字符串再反转为原始的数据类型,这就是反序列化。

这里我们可以引入 字符串 与 byte 之间的转换来理解 序列化与反序列化, 字符串与 byte 类型之间互相转换常用的 encode() 函数、与 decode() 函数,分别代表着编码与解码,所以有编码,就一定有解码 。套用在序列化来理解,既然存在序列化,那么就肯定有对应的反序列化哈。

可序列化的数据类型

哪些数据类型是可以序列化,哪些又是不可以序列化的呢?

可序列化:number、str、list、tuple、dict [字典是最常用的序列化数据类型]

不可序列化:class 、def (函数与实例化对象)、set 是无法进行序列化的

Python 中的json

json模块是一个通用的序列化模块,通过它可以完成通用化的序列化与反序列化操作。为什么说是通用的,那是因为几乎所有的编程语言都有json模块,而且他们序列化与反序列化的规则是统一的。

所以我们在 Python 中序列化的内容,在任意其他编程语言中都可以进行反序列化并使用原始的数据,这就是通用的意思。

dumps() 与 loads() 函数

json 中最重要的函数 - 就是 dumps() 与 loads() 函数

方法名 参数 介绍 举例 返回值
dumps obj 对象序列化 json.dumps([1, 2, 3]) 字符串
loads str 反序列化 Json.loads(’[1, 2, 3]’) 原始数据类型

可序列化数据类型演示案例

演示案例如下:

import json

int_test = 666				# 定义 整型、字符串、列表、元组、字典 五种数据类型 ,用于序列化测试
str_test = 'test_string'
list_test = [1, 2, 3]
tuple_test = (4, 5, 6)
dict_test = {'Name': '托尼.史塔克', 'Sex': '男'}

int_test_json = json.dumps(int_test)		# 将上文中五种数据类型进行序列化操作
str_test_json = json.dumps(str_test)
list_test_json = json.dumps(list_test)
tuple_test_json = json.dumps(tuple_test)
dict_test_json = json.dumps(dict_test)

在 Treminal 终端 执行上述测试脚本,如下图:

这里我们重点介绍一下 字典类型的序列化结果

In [7]: dict_test_json
Out[7]: '{"Name": "\\u6258\\u5c3c.\\u53f2\\u5854\\u514b", "Sex": "\\u7537"}'

从执行结果我们可以看出字典类型的数据类型,经过序列化后。字典变成了字符串的同时,且字典内的 单引号 变成了 双引号,中文也变成了比特类型,并且进行了 encode 。(这是序列化的一个标准)

为什么我们说 字典类型是非常是和序列化的呢?实际上 json 并不仅仅是一个标准,也是一种文件格式。比如我们编写脚本的 .py 格式的文件,就是 python 文件容器;.txt 格式的文件是普通的文本文件容器;同样的,.json 格式的文件也是文件容器,json 文件存储的样式(格式)就是字典类型的序列化格式。

接下来我们再尝试将上文的五种测试数类型反序列化处理,看看结果会怎样?

_int_test_json = json.loads(int_test_json)
_str_test_json = json.loads(str_test_json)
_list_test_json = json.loads(list_test_json)
_tuple_test_json = json.loads(tuple_test_json)
_dict_test_json = json.loads(dict_test_json)

在 Treminal 终端 执行上述测试脚本,如下图:

划重点:元组类型经过序列化处理后再通过反序列化还原数据时,会变为列表数据类型。这是因为 元组类型 是 python 语言中特有的数据类型,json 作为一个通用格式,无法识别元组类型。所以在针对元组类型进行序列化的时候,会先将 元组类型 ,先转为 列表,再进行序列化处理;同样的在进行反序列化处理时,就会将序列化后的 元组类型 ,又转成了 列表类型 。(类型的转换,不影响对数据的使用)

bool 、None 类型的序列化与反序列化

示例如下:

print(json.dumps(True))
# >>> 输出结果:true

print(json.dumps(False))
# >>> 输出结果:false

print(json.dumps(None))
# >>> 输出结果:null

从上述运行结果来看,bool 类型经过序列化处理后,变成了小写的 true、false;而 None 类型则变成了 小写的 null 。

之所以会这样,是因为在大多数的编程语言中, bool 类型都是小写的 true、false 。json 作为一个通用的序列化模块,也同样遵循着这种规则。(小写的 true、false 依然是字符串类型。 )

接下来我们再将上述的序列化处理后的 bool 、None 类型 进行反序列化处理

print(json.loads(json.dumps(None)))
# >>> 输出结果:None

print(json.loads(json.dumps(True)))
# >>> 输出结果:True

print(json.loads(json.dumps(False)))
# >>> 输出结果:False

从执行结果我们看到,经过反序列化之后,bool、None 类型又被还原成了 python 可读的状态。

Python 中的pickle

pickle模块与json模块一样可以进行序列化与反序列化,区别在于 pickle 是 Python 内置的序列化模块,而且不像 json 那么通用,它只能用于 python 自身来使用,其他语言可能就无法处理了,但pickle模块的性能是要比 json 更好的。如果是仅仅用于 python 自身来使用,pckle 模块还是一个挺不错的选择哦。

dumps() 与 loads() 函数

方法名 参数 介绍 举例 返回值
dumps obj 对象序列化 json.dumps([1, 2, 3]) 比特
loads str 反序列化 Json.loads(’[1, 2, 3]’) 原始数据类型

注意:区别于 json ,pickle 模块的 dumps() 函数 返回的是 byte 类型 ,而 loads() 函数也仅支持 byte 类型的 pickle 序列进行反序列化的操作。

pickle模块的序列化与反序列化练习

pickle模块与json模块的用法是完全一致的,这里我们就不过多的演示,只针对 dict 类型演示一下即可。

json 模块 - 序列化小实战

需求:

创建一个 test.json 的空文件。

定义一个 write 函数写入 dict 数据类型的内容到 test.json 文件

定义一个 read 函数,将写入到 test.json 文件的内容,反序列化读取出来

# coding:utf-8

import json

data = {'name': '托尼·史塔克', 'age': 52, 'top': 185}

def read(path):                 # 定义 read() 函数,读取 test.json 文件(返回对象为 反序列化后的内容)
    with open(path, 'r') as f:
        data = f.read()

    return json.loads(data)

def write(path, data):          # 定义 write() 函数,将 data 写入到 test.json 文件
    with open(path, 'w') as f:
        if isinstance(data, dict):      # 判断 data 是否为字典类型。不是的情况下主动抛出异常
            _data = json.dumps(data)
            f.write(_data)
        else:
            raise TypeError('\'data\' 不是一个字典类型的数据')
    return True

if __name__ == '__main__':
    write('test.json', data)
    result = read('test.json')
    print(result)
    result['Sex'] = 'Man'           # 加入 {'Sex': 'Max'} 键值对
    write('test.json', result)      # 将加入的 键值对 写入 test.json 文件
    result_test_json = read('test.json')
    print(result_test_json)

执行结果如下:

总结:json的使用在我们的未来 工作中是非常高频的,所以大家一定要多多练习,加以掌握。

到此这篇关于Python文件的应用之序列化与反序列化详解的文章就介绍到这了,更多相关Python文件序列化内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • python3序列化与反序列化用法实例

    本文实例讲述了python3序列化与反序列化用法.分享给大家供大家参考.具体如下: #coding=utf-8 import pickle aa={} aa["title"]="我是好人" aa["num"]=2 t=pickle.dumps(aa)#序列化这个字典 print(t) f=pickle.loads(t)#反序列化,还原原来的状态 print(f) 运行结果如下: (dp0 S'num' p1 I2 sS'title' p2 S'\

  • Python序列化与反序列化pickle用法实例

    这篇文章主要介绍了Python序列化与反序列化pickle用法实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 要将Python对象作为一个文件的形式保存到磁盘,就叫序列化: 当我们需要用到这个这对象,再从磁盘加载这个对象,就叫反序列化 Python自带的pickle可以帮我们实现,pickle这个单词是咸菜的意思,咸菜耐储存,是不是很形象呀? 对象的存储分为两步: 1.将对象在内存中的数据抓取取来,转换成一个有序的文本,这一步就是序列化 2

  • 老生常谈Python序列化和反序列化

    通过将对象序列化可以将其存储在变量或者文件中,可以保存当时对象的状态,实现其生命周期的延长.并且需要时可以再次将这个对象读取出来.Python中有几个常用模块可实现这一功能. pickle模块 存储在变量中 dumps(obj)返回存入的字节 dic = {'age': 23, 'job': 'student'} byte_data = pickle.dumps(dic) # out -> b'\x80\x03}q\x00(X\x03\x00\x00\...' print(byte_data)

  • Python使用pickle进行序列化和反序列化的示例代码

    一.说明 早上看到Python使用pickle进行序列化和反序列化,然后发现面临的一个获取不到返回值的框架,似乎可以通过在框架中先序列化,然后在外部进行反序列化的方法来实现.就研究了一下pickle库的具体使用. 本身也没什么复杂,一方面还是怕忘记,另一方面是自从学Java听到反序化这个词开始就有一种莫明其妙的恐具感总觉得是什么高大上的东西.Java反序列化可参见"Java反序列化漏洞实现". 二.代码实现 import pickle class BeSerializing: def

  • Python序列化与反序列化相关知识总结

    Python序列化与反序列 在程序运行的过程中,所有的变量都是在内存中,比如,定义一个 dict: d = dict(name='Bob', age=20, score=88) 可以随时修改变量,比如把 name 改成 'Bill',但是一旦程序结束,变量所占用的内存就被操作系统全部回收.如果没有把修改后的 'Bill' 存储到磁盘上,下次重新运行程序,变量又被初始化为 'Bob'. 我们把变量从内存中变成可存储或传输的过程称之为序列化,在 Python 中叫 pickling,在其他语言中也被

  • 浅析Python 序列化与反序列化

    序列化是将对象的状态信息转换为可以存储或传输的形式的过程.在序列化期间,对象将其当前状态(存在内存中)写入到临时或持久性存储区(硬盘).以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象. 实现对象的序列化和反序列化在python中有两种方式:json 和 pickle. 其中json用于字符串 和 python数据类型间进行转换,pickle用于python特有的类型 和 python的数据类型间进行转换,pickle是python特有的. 1.JSON序列化:json.dump

  • Python文件的应用之序列化与反序列化详解

    目录 初识序列化与反序列化 什么是序列化? 可序列化的数据类型 Python 中的json dumps() 与 loads() 函数 可序列化数据类型演示案例 bool .None 类型的序列化与反序列化 Python 中的pickle dumps() 与 loads() 函数 pickle模块的序列化与反序列化练习 json 模块 - 序列化小实战 前面章节我们学些了文件对象的创建.写入与读取,并且针对 .py 文件 与 .txt 文件进行了有针对性的小练习. 通过前面的学习我们知道,文件对象

  • Java基础之序列化与反序列化详解

    目录 1.什么是序列化与反序列化? 2.Java如何实现序列化和反序列化? 3.如何自定义序列化和反序列化呢? 4.writeObject和readObject方法 5.serializable接口 1.什么是序列化与反序列化? 序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程.一般将一个对象存储至一个储存媒介,例如档案或是记亿体缓冲等.在网络传输过程中,可以是字节或是XML等格式.而字节的或XML编码格式可以还原完全相等的对象.这个相反的过程又称为反序列

  • python文件特定行插入和替换实例详解

    python文件特定行插入和替换实例详解 python提供了read,write,但和很多语言类似似乎没有提供insert.当然真要提供的话,肯定是可以实现的,但可能引入insert会带来很多其他问题,比如在插入过程中crash掉可能会导致后面的内容没来得及写回. 不过用fileinput可以简单实现在特定行插入的需求: Python代码 import os import fileinput def file_insert(fname,linenos=[],strings=[]): ""

  • ProtoStuff不支持BigDecimal序列化及反序列化详解

    目录 引言 1. 场景复现 2. 疑似原因与兼容方法 引言 平时使用ProtoStuff作为序列化工具,对于一些POJO对象序列化,但是在实际使用中,发现针对BigDecimal对象进行序列化时却出现了问题 不管什么数,生成的byte数组都一样 无法正确反序列化 下面记录一下这个问题 1. 场景复现 我们使用的protostuff依赖如下 <dependency> <groupId>com.dyuproject.protostuff</groupId> <arti

  • Java中对象序列化与反序列化详解

    本文实例讲述了Java中对象序列化与反序列化.分享给大家供大家参考.具体如下: 一.简介 对象序列化(Serializable)是指将对象转换为字节序列的过程,而反序列化则是根据字节序列恢复对象的过程. 序列化一般用于以下场景: 1.永久性保存对象,保存对象的字节序列到本地文件中: 2.通过序列化对象在网络中传递对象: 3.通过序列化在进程间传递对象. 对象所属的类必须实现Serializable或是Externalizable接口才能被序列化.对实现了Serializable接口的类,其序列化

  • Java对象的序列化与反序列化详解

    一.序列化和反序列化的概念 把对象转换为字节序列的过程称为对象的序列化,把字节序列恢复为对象的过程称为对象的反序列化. 对象的序列化主要有两种途径: Ⅰ . 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中 Ⅱ.  在网络上传送对象的字节序列. 当两个进程在进行远程通信时,彼此可以发送各种类型的数据.无论是何种类型的数据,都会以二进制序列的形式在网络上传送.发送方需要把这个Java对象转换为字节序列,才能在网络上传送:接收方则需要把字节序列再恢复为Java对象. 二.序列化API 1.

  • Java IO之序列化与反序列化详解

    目录 1.什么是序列化与反序列化? 2.为什么要做序列化? 3.Java 怎么进行序列化? 总结 1.什么是序列化与反序列化? 序列化:指把堆内存中的 Java 对象数据,通过某种方式把对象存储到磁盘文件中或者传递给其他网络节点(在网络上传输).这个过程称为序列化.通俗来说就是将数据结构或对象转换成二进制串的过程 反序列化:把磁盘文件中的对象数据或者把网络节点上的对象数据,恢复成Java对象模型的过程.也就是将在序列化过程中所生成的二进制串转换成数据结构或者对象的过程 2.为什么要做序列化? ①

  • .Net中的序列化和反序列化详解

    序列化和反序列化相信大家都经常听到,也都会用, 然而有些人可能不知道:.net为什么要有这个东西以及.net Frameword如何为我们实现这样的机制, 在这里我也是简单谈谈我对序列化和反序列化的一些理解. 一.什么序列化和反序列化 序列化通俗地讲就是将一个对象转换成一个字节流的过程,这样就可以轻松保存在磁盘文件或数据库中.反序列化是序列化的逆过程,就是将一个字节流转换回原来的对象的过程. 然而为什么需要序列化和反序列化这样的机制呢?这个问题也就涉及到序列化和反序列化的用途了, 对于序列化的主

  • 将python文件打包exe独立运行程序方法详解

    首先需要安装pyinstaller库. pip install pyinstaller exe程序打包步骤 cmd 进入要编译的python文件所在的文件夹, 然后 pyinstaller -F hello.py hello.py就是我要打包的文件. 常用参数: -F 生成单个的exe文件. -w 隐藏运行窗口. -h 可以查看帮助信息,更多指令可以通过这个查看. 最开始 D:\pyinstaller 目录下只有hello.py这一个文件,其它的文件都是后生成的. 生成的exe文件在dist里,

  • php中序列化与反序列化详解

    把复杂的数据类型压缩到一个字符串中 serialize() 把变量和它们的值编码成文本形式 unserialize() 恢复原先变量 eg: $stooges = array('Moe','Larry','Curly'); $new = serialize($stooges); print_r($new);echo "<br />"; print_r(unserialize($new)); 结果:a:3:{i:0;s:3:"Moe";i:1;s:5:&q

随机推荐