zoukankan      html  css  js  c++  java
  • Pickle模块数据对象持久化操作

    Pickle模块的作用是持久化(序列化)的储存数据。
    因此我先解释下:什么是序列化与反序列化、什么是对象序列化和对象反序列化。
    通俗地讲,它们的定义如下:
    序列化: 把一个对象保存到一个文件或数据库字段中去;
    反序列化: 在适当的时候把这个文件再转化成原来的对象使用;
    对象的序列化: 把对象转换为字节序列的过程;
    对象的反序列化: 把字节序列恢复为对象的过程;

    使用场合:
    使用序列化主要是因为跨平台和对象存储的需求,因为网络上只允许字符串或者二进制格式,而文件需要使用二进制流格式。
    如果想把一个内存中的对象存储下来就必须使用序列化转换为xml(字符串)、json(字符串)或二进制(流)等

    注意: file.write/read操作的字符串对象,而pickle.dump/load操作的是结构化数据对象(如:列表、字典)。

    常用接口:
    (1) pickle.dump(obj, file, [,protocol])    #将obj对象序列化存入已经打开的file中。
         obj: 结构化对象
         file: 类文件对象(对象保存) 
        protocol: 序列化使用的协议版本。protocol默认值为0。
                      0:ASCII协议,所序列化的对象使用可打印的ASCII码表示;
                      1:老式的二进制协议;
                      2:2.3版本引入的新二进制协议,较以前的更高效
    (2) pickle.load(file)                        # 将file中的对象序列化读出。
    (3) pickle.dumps(obj[, protocol])   #以字节对象形式返回封装的对象,不需要写入文件中。
    (4) pickle.loads(file)                      #从字节对象中读取被封装的对象,并返回。

    dump能将多个对象序列化存储到同一个文件中,随后调用load()来以同样的顺序反序列化读出这些对象。

    #pickle用法举例:  version: python 3.3.4
    1.dump和load
    >>> import pickle                           #导入pickle
    >>> my_list = ['ABC','123','中文',['123']]  #添加一个测试列表
    >>> pickle_file = open('my_list.pkl','wb')  #文件(my_list.pkl)必须以二进制可写模式打开,即"wb"
    >>> pickle.dump(my_list,pickle_file)        #调用pickle.dump方法,将my_list以二进制的方式写入pickle_file对象
    >>> pickle_file.close()                     #关闭文件对象
    >>> import os; os.getcwd()                  #引入os包,查看当前python目录
    'D:\Python33'
    >>> os.listdir('D:\Python33')              #查看指定目录下的文件,可以看到已经生成一个名为my_list.pkl的二进制文件     
    [... 'my_list.pkl', .....]
    
    >>> pickle_file2 = open('my_list.pkl','rb') #文件(my_list.pkl)必须以二进制可读模式打开,即"rb"
    >>> my_list2 = pickle.load(pickle_file2)    #调用ickle.load方法,将以二进制格式保存的对象还原回来
    >>> print (my_list2)
    ['ABC', '123', '中文', ['123']]             #可以看出对象已经还原
    
    #改进写法:
    >>> import pickle
    >>> my_list = ['ABC','123','中文',['123']]
    >>> with open('my_list.pkl','wb') as file1:  #采用with open as方式,不需要再调用close()
    pickle.dump(my_list,file1)    
    >>> import os
    >>> os.listdir(os.getcwd())
    [... 'my_list.pkl', .....]
    >>> with open('my_list.pkl','rb') as file2:
    new_list = pickle.load(file2)    
    >>> print (new_list)
    ['ABC', '123', '中文', ['123']]
    
    2.dumps和loads
    #测试元组
    >>> import pickle                 #导入pickle
    >>> tuple1 = ('A',1,'小泉')       #添加一个元祖
    >>> tuple1
    ('A', 1, '小泉')
    >>> str1 = pickle.dumps(tuple1)   #以字节对象形式返回封装的对象,不需要写入文件中
    >>> str2 = pickle.loads(str1)     #从字节对象中读取被封装的对象
    >>> print (str2)                  
    ('A', 1, '小泉')
    >>> type(str2)
    <class 'tuple'>
    
    #测试字符串
    >>> str = 'Hello World!'
    >>> import pickle
    >>> str1 = pickle.dumps(str)
    >>> str2 = pickle.loads(str1)
    >>> print (str2)
    Hello World!
    >>> type(str)
    <class 'str'>
    >>> type(str2)
    <class 'str'>

    Pickle与CPickle对比
    前者是完全用Python来实现的模块,这个CPickle是用C来实现的,它的速度要比pickle快好多倍。
    一般建议如果电脑中只要有CPickle的话都应该使用它。

    参考资料:
    pickle模块的使用讲解: http://blog.csdn.net/coffee_cream/article/details/51754484

  • 相关阅读:
    k8s 节点的 NodeAffinity 使用
    template 与 host , item trigger的关系
    mysql 性能优化思路
    nginx 配sorry page
    修改tomcat JVM 大小 jdk--目录修改
    (转)MySQL慢查询分析优化 + MySQL调优
    注册表操作 Microsoft.Win32.Registry与RegistryKey类
    C#(99):WCF之.NET Remoting通讯
    CallContext线程数据缓存-调用上下文
    C#(99):JSON与对象的序列化与反序列化
  • 原文地址:https://www.cnblogs.com/huangbiquan/p/7816625.html
Copyright © 2011-2022 走看看