实例讲解python中的序列化知识点

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

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

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

我们把变量从内存中变成可存储或传输的过程称之为序列化,在Python中叫pickling,在其他语言中也被称之为serialization,marshalling,flattening等等,都是一个意思。

序列化之后,就可以把序列化后的内容写入磁盘,或者通过网络传输到别的机器上。

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

Python提供了pickle模块来实现序列化。

首先,我们尝试把一个对象序列化并写入文件:

>>> import pickle
>>> d = dict(name='Bob', age=20, score=88)
>>> pickle.dumps(d)
b'\x80\x03}q\x00(X\x03\x00\x00\x00ageq\x01K\x14X\x05\x00\x00\x00scoreq\x02KXX\x04\x00\x00\x00nameq\x03X\x03\x00\x00\x00Bobq\x04u.'

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

>>> f = open('dump.txt', 'wb')
>>> pickle.dump(d, f)
>>> f.close()

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

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

>>> f = open('dump.txt', 'rb')
>>> d = pickle.load(f)
>>> f.close()
>>> d
{'age': 20, 'score': 88, 'name': 'Bob'}

变量的内容又回来了!

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

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

以上就是本篇文章所讲述的所有内容,这篇文章主要介绍了python序列化的相关知识,希望你能借助资料从而理解上述所说的内容。希望我在这片文章所讲述的内容能够对你有所帮助,让你学习python更加轻松。

(0)

相关推荐

  • python模块之sys模块和序列化模块(实例讲解)

    sys模块 sys模块是与python解释器交互的一个接口 sys.argv 命令行参数List,第一个元素是程序本身路径 sys.exit(n) 退出程序,正常退出时exit(0),错误退出sys.exit(1) sys.version 获取Python解释程序的版本信息 sys.path 返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值 sys.platform 返回操作系统平台名称 序列化模块 序列化的目的: 以某种存储形式使自定义对象持久化 将对象从一个地方传递到另一个地

  • 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序列化基础知识(json/pickle)

    我们把对象(变量)从内存中变成可存储的过程称之为序列化,比如XML,在Python中叫pickling,在其他语言中也被称之为serialization,marshalling,flattening等等,都是一个意思. 序列化后,就可以把序列化后的内容写入磁盘,或者通过网络传输到其他服务器上,反过来,把变量内容从序列化的对象重新读到内存里称之为反序列化,即unpickling json(JavaScript Object Notation) 一种轻量级的数据交换格式.它基于ECMAScript的

  • 浅析Python中的序列化存储的方法

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

  • 老生常谈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实现JSON反序列化类对象的示例

    我们的网络协议一般是把数据转换成JSON之后再传输.之前在Java里面,实现序列化和反序列化,不管是 jackson ,还是 fastjson 都非常的简单.现在有项目需要用Python来开发,很自然的希望这样的便利也能在Python中体现. 但是在网上看了一些教程,讲反序列化的时候,基本都是转换为 dict 或者 array .这种编程方式我从情感上是无法接受的.难道是这些JSON库都不支持反序列化为类对象?我马上打消了这个念头,Python这样强大的脚本语言,不可能没有完善的JSON库. 于

  • Python Json序列化与反序列化的示例

    不同的编程语言有不同的数据类型; 比如说: Python的数据类型有(dict.list.string.int.float.long.bool.None) Java的数据类型有(bool.char.byte.short.int.long.float.double) C的数据类型有(bit.bool.char.int.short.long.unsigned.double.float) Tcl的数据类型(int.bool.float.string) Ruby的数据类型(Number.String.R

  • 实例讲解python中的序列化知识点

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

  • 实例讲解Python中的私有属性

    在Python中可以通过在属性变量名前加上双下划线定义属性为私有属性,如例子: 复制代码 代码如下: #! encoding=UTF-8   class A:     def __init__(self):                  # 定义私有属性         self.__name = "wangwu"                  # 普通属性定义         self.age = 19          a = A()   # 正常输出 print a.ag

  • 实例讲解Python中global语句下全局变量的值的修改

    Python的全局变量:int string, list, dic(map) 如果存在global就能够修改它的值.而不管这个global是否是存在于if中,也不管这个if是否能够执行到. 但是,如果没有 if bGlobal: global g_strVal; int string 将会报错.而list dic(map)是ok的. #!/usr/bin/dev python import sys import os g_nVal = 0; g_strVal = "aaaa"; g_m

  • 实例讲解Python中整数的最大值输出

    在Python中可以存储很大的值,如下面的Python示例程序: x = 10000000000000000000000000000000000000000000; x = x + 1 print (x) 输出: 10000000000000000000000000000000000000000001 在Python中,整数的值不受位数的限制,可以扩展到可用内存的限制.因此,我们永远不需要任何特殊的安排来存储大数字(想象一下在C / C ++中进行上述算术). 在Python 3中,对于所有类型

  • 实例讲解Python中sys.argv[]的用法

    sys.argv[]说白了就是一个从程序外部获取参数的桥梁,这个"外部"很关键,所以那些试图从代码来说明它作用的解释一直没看明白.因为我们从外部取得的参数可以是多个,所以获得的是一个列表(list),也就是说sys.argv其实可以看作是一个列表,所以才能用[]提取其中的元素.其第一个元素是程序本身,随后才依次是外部给予的参数. druid.py如下 import sys a = sys.argv[0] print(a) 保存运行如下 得到的结果是test.py,这就是0指代码(即此.

  • 实例讲解python中的协程

    python协程 线程和进程的操作是由程序触发系统接口,最后的执行者是系统:协程的操作则是程序员. 协程存在的意义:对于多线程应用,CPU通过切片的方式来切换线程间的执行,线程切换时需要耗时(保存状态,下次继续).协程,则只使用一个线程,在一个线程中规定某个代码块执行顺序. 协程的适用场景:当程序中存在大量不需要CPU的操作时(IO),适用于协程: event loop是协程执行的控制点, 如果你希望执行协程, 就需要用到它们. event loop提供了如下的特性: 注册.执行.取消延时调用(

  • 实例讲解Python中SocketServer模块处理网络请求的用法

    SocketServer创建一个网络服务框架.它定义了类来处理TCP,UDP, UNIX streams 和UNIX datagrams上的同步网络请求. 一.Server Types 有五个不同的服务器类在SocketServer中. 1.BaseServer定义了API, 而且他不是用来实例化和直接使用的. 2.TCPServer用作TCP/IP的socket通讯. 3.UDPServer使用datagram sockets. 4.UnixStreamServer和UnixDatagramS

  • 实例讲解Python中浮点型的基本内容

    1.浮点数的介绍 float(浮点型)是Python基本数据类型中的一种,Python的浮点数类似数学中的小数和C语言中的double类型: 2.浮点型的运算 浮点数和整数在计算机内部存储的方式是不同的,整数运算永远是精确的,然而浮点数的运算则可能会有四舍五入的误差.比如观察以下运算,在数学中很容易得出结果应该是0.8965,而使用程序运算得出的结果却是:0.8965000000000001: a = 1.25 b = 0.3535 print(a-b) #输出:0.89650000000000

  • 实例讲解Python中函数的调用与定义

    调用函数: #!/usr/bin/env python3 # -*- coding: utf-8 -*- # 函数调用 >>> abs(100) 100 >>> abs(-110) 110 >>> abs(12.34) 12.34 >>> abs(1, 2) Traceback (most recent call last): File "<stdin>", line 1, in <module&

  • python中__init__方法知识点详解

    目录 介绍__init__方法的作用 讲解__init__方法的语法 演示如何在类中使用__init__方法初始化类的属性 讲解如何使用__init__方法给对象动态添加属性 __init__方法的多态特性 __init__和super的用法 提醒注意事项 总结 介绍__init__方法的作用 __init__ 方法是 Python 中面向对象编程中类的特殊方法,也称为构造方法,当创建一个类的实例时,__init__ 方法会自动调用. 它的主要作用是初始化实例的属性,在实例被创建后,你可以通过这

随机推荐