zoukankan      html  css  js  c++  java
  • Python 序列化

    一、序列化介绍

        在程序的运行过程中,我们定义的变量都是存放在内存中的,如 name = "Tom" ,我们也可以随时修改变量,如 name = "John",

    但是一旦程序运行结束,变量所占用的内存就被系统回收,也就是变量被销毁了,下次重新运行程序时,变量又被初始化为 name = "Tom"

    因此,有没有什么办法能把修改后的变量保存下来呢?或者说把存放在内存中的变量存放到磁盘中,实现永久保存,这就需要用到序列化

    什么是序列化:把内存中的对象(变量也是一个对象)持久保存到磁盘中的过程就是序列化,一般我们以文件的形式保存到磁盘中

    什么是反序列化:将文件中的数据重新解析为一个Python对象,然后保存到内存中的过程,就是反序列化

    序列化应用在哪里呢?比如我们在玩仙剑奇侠传这个单机游戏时,游戏是需要运行在内存中的,然后我们进行存档,存档的过程就是序列化,

    会把在内存中的游戏数据保存成一个磁盘文件,下次我们读取存档的时候,就会读取这个文件,把磁盘文件反序列化到内存中,继续游戏进度。


    实现序列化的模块:

    模块名 描述 提供的API
    pickle 用于实现将 Python 对象转换成特定的二进制,然后持久化保存到磁盘文件中 dump() 、load()
    dumps() 、loads()
    json 用于实现将 Python 对象转换成 json 字符串,然后持久化保存到磁盘文件中 dump() 、load()
    dumps() 、loads()
    shelve 用于实现将 Python 对象转换成类似字典的对象,然后持久化保存到磁盘文件中 open()


    二、pickle 模块

    pickle.dump(obj,file) :用于将一个对象序列化到磁盘文件中
    pickle.load(file) :用于将磁盘文件中的数据反序列化到内存中,结果返回一个对象,需要用一个变量来接收

    pickle.dumps(obj) :用于将一个对象序列化成一个字符串,并不保存到磁盘文件中,结果返回一个字符串对象,需要用变量来接收
    pickle.loads() :用于将字符串反序列化成 python 对象

    In [1]: import pickle
    
    In [2]: data = {'name': 'Tom', 'age': 22}     # 先定义一个对象
     
    In [3]: with open('1.pickle', 'wb') as fd:    # 序列化,因为是转换成二进制数据,所以要以'wb'方式写入文件
       ...:     pickle.dump(data, fd)
       ...:     
    
    In [4]: with open('1.pickle', 'rb') as fd:    # 反序列化,同理要以'rb'方式读取文件
       ...:     data2 = pickle.load(fd)
       ...:     
    
    In [5]: data2
    Out[5]: {'age': 22, 'name': 'Tom'}
    In [1]: import pickle
    
    In [2]: data = {'name': 'Tom', 'age': 22}
    
    In [3]: data2 = pickle.dumps(data)    # 序列化
    
    In [4]: type(data2)                   # 结果是一个字符串
    Out[4]: str
    
    In [5]: pickle.loads(data2)           # 反序列化
    Out[5]: {'age': 22, 'name': 'Tom'}

    三、json 模块

    pickle模块是用 python 写的,只适用于 python 语言,而 json 模块是跨语言的,可以使用 json 与其他语言进行数据交互

    json.dump(obj,file) :用于将一个对象序列化到磁盘文件中
    json.load(file) :用于将磁盘文件中的数据反序列化到内存中,结果返回一个对象,需要用一个变量来接收

    json.dumps(obj) :用于将一个对象序列化成一个字符串,并不保存到磁盘文件中,结果返回一个字符串对象,需要用变量来接收
    json.loads() :用于将字符串反序列化成 python 对象

    In [1]: import json
    
    In [2]: data = {'name': 'Tom', 'age': 22}
    
    In [3]: with open('1.json', 'w') as fd:    # 序列化
       ...:     json.dump(data, fd)
       ...:     
    
    In [4]: with open('1.json', 'r') as fd:    # 反序列化
       ...:     data2 = json.load(fd)
       ...:     
    
    In [5]: data2
    Out[5]: {u'age': 22, u'name': u'Tom'}
    In [1]: import json
    
    In [2]: data = {'name': 'Tom', 'age': 22}
    
    In [3]: data2 = json.dumps(data)    # 序列化
    
    In [4]: type(data2)
    Out[4]: str
    
    In [5]: json.loads(data2)   # 反序列化
    Out[5]: {u'age': 22, u'name': u'Tom'}

        

  • 相关阅读:
    ITMS-90809
    iOS ipa 优化减小安装大小
    Xcode 常用路径
    如何查看 Assets.car 内资源
    UILabel 实现圆角
    iOS 改变 UITextField 的 Placeholder 的字体与颜色
    ATS (App Transport Security)
    iOS semaphore 使用
    macOS 自定义 NSButton
    iOS开发——设计模式那点事
  • 原文地址:https://www.cnblogs.com/pzk7788/p/10348496.html
Copyright © 2011-2022 走看看