zoukankan      html  css  js  c++  java
  • Python3学习之路~5.7 Json & pickle 模块

    用于序列化的两个模块

    • json,用于字符串 和 python数据类型间进行转换
    • pickle,用于python特有的类型 和 python的数据类型间进行转换

    Json模块提供了四个功能:dumps、dump、loads、load

    pickle模块提供了四个功能:dumps、dump、loads、load

    json.dumps 将数据通过特殊的形式转换为所有程序语言都认识的字符串

    json.dump 将数据通过特殊的形式转换为所有程序语言都认识的字符串,并写入文件

    pickle.dumps 将数据通过特殊的形式转换为只有Python语言认识的字符串

    pickle.dump 将数据通过特殊的形式转换为只有Python语言认识的字符串,并写入文件

    Json序列化举例:

    # json是所有语言中都通用的,适用于不同语言进行数据交互。
    # 但json只能处理简单的数据类型,如果要处理复杂的,可以使用pickle
    # 应用场景举例:当你使用虚拟机(或者玩游戏)时,中间你突然有点别的事情,于是要将虚拟机挂起,以便下次使用时还是现在的状态。
    # 于是就用到了json,json序列化将虚拟机目前的状态(比如进行了什么操作,打开了什么文件)保存在文件中,
    # 当你干完别的事,再次启动虚拟机时,json反序列化会将文件中保存的状态从文件中读出来,于是你就可以继续上次的操作了。
    
    # dump和load配合使用可以实现序列化和反序列化,
    # 在Python2中可以dump很多次,也可以load很多次,他们一一对应,但是其实这没什么意义
    # 但在Python3中,可以dump很多次,但是当dump多次时,load会报错,所以记住在Python3中永远不要dump多次
    import json
    info = { "name":"Alex", "age":22 }
    
    with open('text.txt','w',encoding='utf-8') as f:
        #f.write(info) #报错,字典不能写入文件中,字符串能写入文件中
        #f.write(str(info)) #太low了
        print(type(json.dumps(info)))  # <class 'str'>
        #f.write( json.dumps(info) ) # 高级做法1
        json.dump(info,f)  # 高级做法2,同上
    json序列化.py
    import json
    with open('text.txt','r',encoding='utf8') as f:
        #data=json.loads(f.read())
        data=json.load(f) #同上
        print(data["age"])
    json反序列化.py

    pickle序列化举例:

    # pickle写进文件中的貌似是一段乱码,其实不然,这是pickle自己的一套语法规则,当然这也不是加密
    # pickle可以序列化所有的数据类型
    # 但是pickle只能在Python中使用,别的语言不认识它
    
    import pickle
    def sayhi(name):
        print("Hello ",name)
    
    info = { "name":"Alex", "age":22, 'func':sayhi }
    
    with open('text2.txt','wb') as f:
        print(type(pickle.dumps(info)))  # <class 'bytes'>
        f.write( pickle.dumps(info) ) # sayhi是一个内存地址,用json序列化就写不到文件中,会报错
    pickle序列化.py
    import pickle
    # def sayhi(name):
    #     print("Hello2 ",name)
    
    with open('text2.txt','rb') as f:
        data=pickle.loads(f.read()) # 报错
        print(data)
        # data["func"]('alex')
    # AttributeError: Can't get attribute 'sayhi' on <module '__main__' from 'D:/python-study/s14/Day04/pickle反序列化.py'>
    # 为什么报错呢?因为sayhi是一个内存地址,当pickle序列化.py程序执行完之后,这个地址就被释放了,当然我们就找不到了。
    # 这里只是想说明一点:pickle可以序列化所有的数据类型,不管这个数据是否可被反序列化
    # 如果想要不报错,可以把sayhi函数的定义拷贝过来,而且还可以执行这个函数
    # 只要保证函数名相同就不会报错,函数体可以完全不一样
    pickle反序列化.py

    json模块的作用之一:根据字符串书写格式,将字符串自动转换成相应格式

    import json
    
    # Python3.x中input方法获取到的都是字符串,相当于Python2.x中的raw_input
    inp_str = input("请输入:") # 输入一个列表,[1,2,3]
    print(type(inp_str)) # <class 'str'>
    inp_str = json.loads(inp_str,encoding="UTF-8") # 根据字符串书写格式,将字符串自动转换成 列表类型
    print(type(inp_str),inp_str[0]) # <class 'list'> 1
    
    inp_str = input("请输入:") # 输入一个字典,{"name":"Rose","age":21,"sex":"F"}
                                 # 切记,字典内部必须是 双引号 !!!单引号会报错。
    print(type(inp_str)) # <class 'str'>
    inp_str = json.loads(inp_str,encoding="UTF-8") # 根据字符串书写格式,将字符串自动转换成 字典类型
    print(type(inp_str),inp_str['name'],inp_str['age'],inp_str['sex']) # <class 'dict'> Rose 21 F
    View Code
  • 相关阅读:
    MySql cmd下的学习笔记 —— 引擎和事务(engine,transaction)
    MySql cmd下的学习笔记 —— 有关视图的操作(algorithm)
    MySql cmd下的学习笔记 —— 有关视图的操作(建立表)
    MySql cmd下的学习笔记 —— 有关常用函数的介绍(数学函数,聚合函数等等)
    MySql cmd下的学习笔记 —— 有关多表查询的操作(多表查询练习题及union操作)
    MySql 在cmd下的学习笔记 —— 有关多表查询的操作(内连接,外连接,交叉连接)
    MySql cmd下的学习笔记 —— 有关子查询的操作(where型,from型,exists型子查询)
    MySql cmd下的学习笔记 —— 有关select的操作(order by,limit)
    剑指Offer--第21题 调整数组顺序使奇数位于偶数前面;
    剑指Offer--和为s的连续正数序列
  • 原文地址:https://www.cnblogs.com/zhengna/p/9214286.html
Copyright © 2011-2022 走看看