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
  • 相关阅读:
    POJ 1141 Brackets Sequence (区间DP)
    UVaLive 6585 && Gym 100299F Draughts (暴力+回溯)
    UVaLive 6950 && Gym 100299K Digraphs (DFS找环或者是找最长链)
    UVaLive 6588 && Gym 100299I (贪心+构造)
    UVa 1611 Crane (构造+贪心)
    Gym 100299C && UVaLive 6582 Magical GCD (暴力+数论)
    UVa 1642 Magical GCD (暴力+数论)
    UVaLive 6591 && Gym 100299L Bus (水题)
    UVaLive 6581 && Gym 100299B What does the fox say? (模拟+STL)
    HDU 5898 odd-even number (数位DP)
  • 原文地址:https://www.cnblogs.com/zhengna/p/9214286.html
Copyright © 2011-2022 走看看