python类库32[序列化和反序列化之pickle]

一 pickle

pickle模块用来实现python对象的序列化和反序列化。通常地pickle将python对象序列化为二进制流或文件。

python对象与文件之间的序列化和反序列化:

pickle.dump()

pickle.load()

如果要实现python对象和字符串间的序列化和反序列化,则使用:

pickle.dumps()

pickle.loads()

可以被序列化的类型有:

* None,True 和 False;

* 整数,浮点数,复数;

* 字符串,字节流,字节数组;

* 包含可pickle对象的tuples,lists,sets和dictionaries;

* 定义在module顶层的函数:

* 定义在module顶层的内置函数;

* 定义在module顶层的类;

* 拥有__dict__()或__setstate__()的自定义类型;

注意:对于函数或类的序列化是以名字来识别的,所以需要import相应的module。

二 pickle的运行过程

在大部分情况下,要是的对象picklable,我们不需要额外的代码。默认地pickle将智能地检查类和实例的属性,当一个类实例反序列化的时候,它的__init__()方法通常不被调用。而是首先创建一个未初始化的实例,然后再回复存储的属性。

但是可以通过实现下列的方法来修改默认的行为:

object.__getstate__() :默认地序列化对象的__dict__,但是如果你实现了__getstate__(),则__getstate__()函数返回的值将被序列化。

object.__setstate__(state) :如果类型实现了此方法,则在反序列化的时候,此方法用来恢复对象的属性。

object.__getnewargs__() : 如果实例构造的时候(__new__())需要参数,则需要实现此函数。

注意:如果__getstate__()返回False,则在反序列化的时候__setstate__()则不被调用。

有的时候为了效率,或上面的3个函数不能满足需求时,需要实现__reduce__()函数。

三 实例

import pickle

# An arbitrary collection of objects supported by pickle.
data = {
    ‘a‘: [1, 2.0, 3, 4+6j],
    ‘b‘: ("character string", b"byte string"),
    ‘c‘: set([None, True, False])
}

with open(‘data.pickle‘, ‘wb‘) as f:
    # Pickle the ‘data‘ dictionary using the highest protocol available.
    pickle.dump(data, f, pickle.HIGHEST_PROTOCOL)

with open(‘data.pickle‘, ‘rb‘) as f:
    # The protocol version used is detected automatically, so we do not
    # have to specify it.
    data = pickle.load(f)
    print(str(data))

四 修改picklable类型的默认行为

class TextReader:
    """Print and number lines in a text file."""

def __init__(self, filename):
        self.filename = filename
        self.file = open(filename)
        self.lineno = 0

def readline(self):
        self.lineno += 1
        line = self.file.readline()
        if not line:
            return None
        if line.endswith(‘\n‘):
            line = line[:-1]
        return "%i: %s" % (self.lineno, line)

def __getstate__(self):
        # Copy the object‘s state from self.__dict__ which contains
        # all our instance attributes. Always use the dict.copy()
        # method to avoid modifying the original state.
        state = self.__dict__.copy()
        # Remove the unpicklable entries.
        del state[‘file‘]
        return state

def __setstate__(self, state):
        # Restore instance attributes (i.e., filename and lineno).
        self.__dict__.update(state)
        # Restore the previously opened file‘s state. To do so, we need to
        # reopen it and read from it until the line count is restored.
        file = open(self.filename)
        for _ in range(self.lineno):
            file.readline()
        # Finally, save the file.
        self.file = file
        
reader = TextReader("hello.txt")
print(reader.readline())
print(reader.readline())
s = pickle.dumps(reader)
#print(s)
new_reader = pickle.loads(s)
print(new_reader.readline())

# the output is 
# 1: hello
# 2: how are you
# 3: goodbye

python类库32[序列化和反序列化之pickle]

时间: 2024-11-05 06:15:03

python类库32[序列化和反序列化之pickle]的相关文章

Python库:序列化和反序列化模块pickle介绍

1 前言 在“通过简单示例来理解什么是机器学习”这篇文章里提到了pickle库的使用,本文来做进一步的阐述. 通过简单示例来理解什么是机器学习 pickle是python语言的一个标准模块,安装python后已包含pickle库,不需要单独再安装.pickle模块实现了基本的数据序列化和反序列化.通过pickle模块的序列化操作我们能够将程序中运行的对象信息保存到文件中去,永久存储:通过pickle模块的反序列化操作,我们能够从文件中创建上一次程序保存的对象.在官方的介绍中,序列化操作的英文描述

Python 学习笔记 - 序列化和反序列化

这一节看看在Python中如何序列化和反序列化.简单的说,序列化就是把内存中保存的数据类型转换为可以存储或者传输的过程,比如说我把一个字典转换为一个字符串这样就可以方便传递或者保存了:反序列化则是倒过来,把字符串转换为对应的数据类型. Python里面常用的有两种方式. JSON Pickle 首先来看看JSON, 例1 比如说我有一个字典如下所示: >>> import json dic={"k1":"v1"} print(dic,type(di

python类库32[多进程同步Lock+Semaphore+Event]

python类库32[多进程同步Lock+Semaphore+Event] 同步的方法基本与多线程相同. 1) Lock 当多个进程需要访问共享资源的时候,Lock可以用来避免访问的冲突. import multiprocessingimport sys def worker_with(lock, f):    with lock:        fs = open(f,"a+")        fs.write('Lock acquired via with\n')        f

python类库32[多进程通信Queue+Pipe+Value+Array]

多进程通信 queue和pipe的区别: pipe用来在两个进程间通信.queue用来在多个进程间实现通信. 此两种方法为所有系统多进程通信的基本方法,几乎所有的语言都支持此两种方法. 1)Queue & JoinableQueue queue用来在进程间传递消息,任何可以pickle-able的对象都可以在加入到queue. multiprocessing.JoinableQueue 是 Queue的子类,增加了task_done()和join()方法. task_done()用来告诉queu

python接口测试之序列化与反序列化(四)

作者 无涯 在python中,序列化可以理解为:把python的对象编码转换为json格式的字符串,反序列化可以理解为:把json格式字符串解码为python数据对象. 在python的标准库中,专门提供了json库与pickle库来处理这部分. 先来学习json的库,导入json库很简单,直接import json,下面通过具体的实例来说明json库对序列化与反序列化的使用.json库的主要方法为: #!/usr/bin/env python#coding:utf-8import  jsonp

python中的序列化和反序列化

~~~~~~滴滴,,什么是序列呢?可以理解为序列就是字符串.序列化的应用 写文件(数据传输) 网络传输 序列化和反序列化的概念   序列化模块:将原本的字典.列表等内容转换成一个字符串的过程就叫做序列化. 序列化:内存中的对象转换为字节序列(字符串) 反序列化:将字节序列转换为内存中的对象 序列化的目的:1.以某种存储形式是自定义对象持久化2.将对象从一个地方传递到另一个地方3.使程序更具有维护性 各种模块的特点和应用 1.json模块:通用的序列化格式 只有很少的一部分数据类型通过json转化

python中的序列化与反序列化

之前,在学习python时,一直弄不明白pickle和json模块的序列化和反序例化之间的区别和用法,最近闲来有时间,重新研究了这两个模块,也算是基本搞明白他们之中的区别了. 用于序列化的两个模块, json,用于字符串 和 python数据类型间进行转换 pickle,用于python特有的类型 和 python的数据类型间进行转换 Json模块提供了四个功能:dumps.dump.loads.load pickle模块提供了四个功能:dumps.dump.loads.load 看下面这个例子

python处理JSON 序列化与反序列化

#序列化 >>> import json>>> d={"key":"value"}>>> d{'key': 'value'}>>> json.dumps(d)'{"key": "value"}' #反序列化>>> j=json.dumps(d)>>> j'{"key": "value&quo

json —— pickle 的序列化和反序列化

前言json的序列化和反序列化 1, json 只能序列化简单的数据类型,如,列表,字典,字符串,等简单的类型,不能序列化复杂的类型. 2, json 是支持所有的语言的,多以我们跨语言的时候都是用json,(和其他语言交互) json 序列化 json的序列化 json.dumps() import jsoninfo = { 'zhang':'123', 'qing':'456'}f = open('json_wenjian','w',encoding='utf-8')f.write(json