zoukankan      html  css  js  c++  java
  • 模块讲解----pickle模块(只在python用的序列化与反序列化)

    特点

    1、只能在python中使用,只支持python的基本数据类型。
    2、可以处理复杂的序列化语法。(例如自定义的类的方法,游戏的存档等)
    3、序列化的时候,只是序列化了整个序列对象,而不是内存地址。
     
    一、内存中操作:
     1 import pickle
     2 #dumps
     3 li = [11,22,33]
     4 r = pickle.dumps(li)
     5 print(r)
     6 
     7 
     8 #loads
     9 result = pickle.loads(r)
    10 print(result)

    二、文本中操作:

    1 #dump:
    2 li = [11,22,33]
    3 pickle.dump(li,open('db','wb'))
    4 
    5 #load
    6 ret = pickle.load(open('db','rb'))
    7 print(ret)

    三、练习:

    pickle的序列化:
    格式:pickle.dumps(序列化对象)

     1 #!/usr/bin/env python
     2 # -*- coding:utf8 -*-
     3 # Author:Dong Ye
     4 
     5 import pickle
     6 
     7 
     8 test = r'test.txt'
     9 
    10 #反序列化代码中也要定义相同的函数名称,函数体没限制
    11 def sayhi(name):
    12     print("hello",name)
    13 
    14 info = {
    15     '':'',
    16     'age':32,
    17     'func':sayhi
    18 }
    19 
    20 print(pickle.dumps(info))
    21 
    22 with open(test,'wb') as f:
    23     f.write( pickle.dumps(info) )

    pickle返序列化:
    格式:pickle.loads(读取文件逐行记录)

     1 #!/usr/bin/env python
     2 # -*- coding:utf8 -*-
     3 # Author:Dong Ye
     4 
     5 import pickle
     6 
     7 test = r'test.txt'
     8 
     9 #需要定义序列化代码中同样的函数名,函数体没限制
    10 def sayhi(name):
    11     print("hello",name)
    12     print("hello2",name)
    13 
    14 
    15 
    16 
    17 with open(test,'rb') as f:
    18     data = pickle.loads(f.read())
    19     print('data>>>',data)
    20 
    21 
    22 print(data['func']("Alex"))
    23 
    24 
    25 显示结果:
    26 data>>> {'': '', 'age': 32, 'func': <function sayhi at 0x00000000007DF1E0>}
    27 hello Alex
    28 hello2 Alex
    29 None
    30 
    31 
    32 注意:
    33 1、print(data['func']("Alex"))时,调用了pickle的反序列化变量data。
    34 
    35 2、需要在序列化和反序列化定义相同的函数名称,但内容可以不一样。否则报错如下:
    36 E:python35python.exe D:/软件/pychar/data/s13/序列化与反序列化/pickle反序列化.py
    37 Traceback (most recent call last):
    38   File "D:/软件/pychar/data/s13/序列化与反序列化/pickle反序列化.py", line 16, in <module>
    39     data = pickle.loads(f.read())
    40 AttributeError: Can't get attribute 'sayhi' on <module '__main__' from 'D:/软件/pychar/data/s13/序列化与反序列化/pickle反序列化.py'>
    41 原因是反序列化脚本中,没有sayhi函数的内存地址:
    42 
    43 3、由于pickle序列化是序列了整个对象,而非某个内存地址,因此在反序列化时,也调用了整个序列对象。所以反序列化对象时,sayhi函数的函数体可以不一样。

    写入文件并序列化

    格式:pickle.demp(序列对象变量,文件名)
     1 import pickle
     2 
     3 
     4 test = r'test.txt'
     5 
     6 #反序列化代码中也要定义相同的函数名称,函数体没限制
     7 def sayhi(name):
     8     print("hello",name)
     9 
    10 info = {
    11     '':'',
    12     'age':32,
    13     'func':sayhi
    14 }
    15 
    16 print(pickle.dumps(info))
    17 
    18 with open(test,'wb') as f:
    19     #f.write( pickle.dumps(info) )
    20     pickle.dump(info,f)  #跟上面的f.write( pickle.dumps(info) )语意完全一样。
     
     
     
    从文件中读取,并返序列化:
    格式:pickle.load(文件名)
     1 import pickle
     2 
     3 test = r'test.txt'
     4 
     5 #需要定义序列化代码中同样的函数名,函数体没限制
     6 def sayhi(name):
     7     print("hello",name)
     8     print("hello2",name)
     9 
    10 
    11 
    12 with open(test,'rb') as f:
    13     # data = pickle.loads(f.read())
    14     data = pickle.load(f)  #跟上面的data = pickle.loads(f.read())语意完全一样。
    15     print('data>>>',data)
    16 
    17 
    18 print(data['func']("Alex"))
    注意:
    需要定义序列化代码中同样的函数名
  • 相关阅读:
    Docker 部署net5程序
    如何将Docker升级到最新版本
    IntelliJ IDEA修改maven默认仓库地址
    PowerDesigner 导出表结构 到Excel
    gradle加载项目过慢
    linux安装docker配置阿里云镜像
    svn 新建文件不能直接提交终于解决了
    Vs2017 NPM 安装 部署
    MYSQL日期时间字符串互转
    消除svn选定(checkout)桌面上文件显示一大堆问号。
  • 原文地址:https://www.cnblogs.com/abobo/p/8080447.html
Copyright © 2011-2022 走看看