zoukankan      html  css  js  c++  java
  • ql的python学习之路-day12

    前言:这一节主要学习json和pickle

    背景:

    相信大家在日常生活中都有接触大型的网络游戏,打游戏的时候都是自己在电脑上操作,自己刷怪升级;当然也会碰到中午去吃饭然后挂机的情况,让电脑自动的刷怪,吃完饭后再来继续手动操作。在这个过程中我们有挂机,挂机的时候其实就是将之前的操作(如:用技能1、技能2、大招、左右移动等)都以文件的形式进行保存,吃完饭回来之后又接着之前的状态进行游戏而不是重头开始。我们这里要讲的序列化以及反序列化就跟这个很类似,挂机前的操作保存为文件就是序列化,吃完饭回来再加载之前的游戏就是反序列化;另外,日常我们也用过虚拟机,虚拟机的挂载,挂载后的恢复也是这样的情况。

    一、json序列化和反序列化

     1 #!/usr/bin/env python
     2 # -*- coding:utf-8 -*-
     3 # Author:qinjiaxi
     4 '''
     5 1.序列化是指将内存的对象存成字符串;
     6 2.反序列化是指将存起来的字符串变成之前的内存对象;
     7 3.json主要作用是所有语言之间的交互,只能进行简单转换比如字符串、列表、字典等,不能处理函数;
     8 4.xlm和json一样,逐渐被json替代;
     9 '''
    10 import json
    11 info = {
    12     'name' : 'qinlang',
    13     'age' : 3
    14 }
    15 f = open('test.txt', 'w')
    16 # f.write(str(info))
    17 f.write(json.dumps(info))#序列化
    18 f.close()

    二、json序列化和反序列化(二)

     1 #!/usr/bin/env python
     2 # -*- coding:utf-8 -*-
     3 # Author:qinjiaxi
     4 import json
     5 info = {
     6     'name' : 'qinlang',
     7     'age' : 3,
     8 
     9 }
    10 f = open('test.txt', 'w')
    11 # f.write(str(info))
    12 f.write(json.dumps(info))#序列化
    13 info['age'] = 4#修改字典中的值
    14 json.dump(info, f)#第二次序列化
    15 f.close()
    16 
    17 #在python2.7里可以一次一次的load,在3.0中只能load一次
    18 #注意:写程序时,只dump一次,只load一次,如果必须要多次,就要多保存几个文件
    19 import json
    20 f1 = open('test.txt', 'r')
    21 data = json.loads(f1.read())#反序列化
    22 print(data)
    23 f1.close()

    三、pickle的序列化和反序列化

    序列化:

     1 # Author:qinjiaxi
     2 #pickle相对json来说可以处理复杂的数据类型,但是只能在python中用
     3 import pickle
     4 def sayhi(name):
     5     print("hi",name)
     6 info = {
     7     'name' : 'qinlang',
     8     'age' : 3,
     9     'func' : sayhi
    10 }
    11 f = open('test.txt', 'wb')
    12 # f.write(str(info))
    13 f.write(pickle.dumps(info))#序列化
    14 f.close()
    15 
    16 pickle.dump(info, f)#第一个是要序列内存的对象,第二个是文件和这个一样f.write(pickle.dumps(info))#序列化

    反序列化:

    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    # Author:qinjiaxi
    import pickle
    #必须加上之前定义的函数,不然会报错,因为之前的函数在序列化中运行后释放了就找不到了
    #注:这个函数的内存地址跟之前的不一样,反序列化的是整个函数对象
    def sayhi(name):
        print("hi",name)
        print('hi2',name)#还可以增加其他功能
    
    f1 = open('test.txt', 'rb')
    data = pickle.loads(f1.read())#反序列化
    print(data)
    print(data['func']('hehe'))#
    f1.close()
    
    data = pickle.load(info,f)#相当于data = pickle.loads(f1.read())#反序列化
  • 相关阅读:
    ECC 构筑安全可靠的区块链
    代理模式和装饰者模式
    Context都没弄明白,还怎么做Android开发?
    如何在Android Studio中查看一个类的继承关系呢?
    Android控件的继承关系
    安卓控件体系结构
    Android View框架总结(三)View工作原理
    Laravel中用GuzzleHttp
    学习PHP好,还是Python好呢?
    ElasticSearch入门 第一篇:Windows下安装ElasticSearch
  • 原文地址:https://www.cnblogs.com/qinlangsky/p/9581866.html
Copyright © 2011-2022 走看看