• Python 基础之序列化模块pickle与json


    :pickle 序列化模块
    把不能够直接存储的数据,变得可存储就是序列化
    把存储好的数据,转化成原本的数据类型,加做反序列化

    php: 序列化和反序列化
    (1)serialize
    (2)unserialize


    #1.dumps 把任意对象序列化成一个bytes
    #:

    #导入pickle模块 => 模块.方法()
    import pickle

    lst = [1,2,3,4,5,6]
    res = pickle.dumps(lst)
    print(res,type(res))
    #b'x80x03]qx00(Kx01Kx02Kx03Kx04Kx05Kx06e.' <class 'bytes'>
    #2.loads 把任意bytes反序列化成原来数据

    res = pickle.loads(res)
    print(res,type(res))

    #encode decode 能实现序列化吗?
    '''只有字符串可以使用encode 或 decode ,容器类型数据等不可以'''
    #res = lst.encode("utf-8")
    #print(res)

    #对函数进行序列化

    #2:

    import pickle
    def func():
        print("哈哈哈哈哈哈哈哈哈哈")
    func()
    # 序列化成字符串
    res = pickle.dumps(func)
    print(res)
    #反序列化字节流 恢复原来的数据类型
    res = pickle.loads(res)
    print(res)
    res()
    对函数序列化例2输出结果为:

    哈哈哈哈哈哈哈哈哈哈

    b'x80x03c__main__ func qx00.'

    <function func at 0x00000208DE411E18>

    哈哈哈哈哈哈哈哈哈哈


    #对迭代器进行序列化

    import pickle
    it = iter(range(10))
    from collections import Iterable,Iterator
    print(isinstance(it,Iterator))
    res = pickle.dumps(it) #序列化
    res = pickle.loads(res) #反序列化
    for i in res:
        print(i) #输出:0 1 2 3 4 5 6 7 8 9

    #所有数据类型都可以通过pickle模块进行序列化
    #dump 把对象序列化后写入到file_like Object(即文件对象)
    #load file_like Object(即文件对象)中的内容拿出来,反序列化原来数据

    it = iter(range(10))
    with open("ceshi.pkl",mode="wb") as fp:
        pickle.dump(it,fp)

    with open("ceshi.pkl",mode="rb") as fp:
        res = pickle.load(fp)

    print(res)
    for i in res:
        print(i)

    :json
    json 模块能够转化的数据类型如下:int float bool str list tuple dict None 8个数据可以序列化
    json 数据类型的提出,是让不同的语言之间形成数据交流
    pickle 返回的是二进制的字节流,它是用来进行数据的传输和存储的
    json     序列化成一个字符串
    pickle   序列化成一个字节流
    #:
    import json
    #dumps  loads 是一对,用来序列化和反序列化的,在字符串和其他数据之间切换
    #序列化
    #ensure_ascii = True 如果想要显示中文ensure_ascii = False
    #sort_keys = True 对字典的键进行排序(默认按照ascii从小到大排序)
    #1:
    dic = {'name':"ONE","age":8,"sex":"BOY","family":['FF',"MM"]}
    res = json.dumps(dic,ensure_ascii=True,sort_keys=True)
    print(res,type(res)) #{"age": 8, "family": ["FF", "MM"], "name": "ONE", "sex": "BOY"} <class 'str'>
    #反序列化
    res = json.loads(res)
    print(res,type(res)) #{'age': 8, 'family': ['FF', 'MM'], 'name': 'ONE', 'sex': 'BOY'} <class 'dict'>

    # #dump  load 是一对,用来进行数据的存储和提取
    #2:(dic写入到ceshi001.json到在通过load读出)

    dic = {'name':"ONE","age":8,"sex":"BOY","family":['FF',"MM"]}
    with open("ceshi001.json",mode="w",encoding="utf-8") as fp:
        res1 = json.dump(dic,fp,ensure_ascii=False)
    with open("ceshi001.json",mode="r",encoding="utf-8") as fp:
        res = json.load(fp)
    print(res,type(res)) 

     

    :json  pickle 两个模块之间的区别
    #json
    可以连续dump,但是load只能一次性把所有数据拿出来,进行反序列化,造成数据错误
    针对于这个弊端,可以使用loads来解决

    dic = {'a':1,'b':2}
    with open('ceshi002.json',mode="w",encoding='utf-8') as fp:
        json.dump(dic,fp)
        fp.write(' ')
        json.dump(dic,fp)
        fp.write(' ')
    print("=====================")
    with open("ceshi002.json",mode="r",encoding="utf-8") as fp:
        #res = json.load(fp) error
        for i in fp:
            #读一行,反序列化成一个字典,一次循环
            res= json.loads(i)
            print(res,type(res))


    #pickle
    允许连续dump,也允许连续load
    #1:
    import pickle
    dic = {'a':3,'b':4}
    with open("ceshi003.pkl",mode="wb") as fp:
        pickle.dump(dic,fp)
        pickle.dump(dic,fp)
        pickle.dump(dic,fp)
        pickle.dump(dic,fp)

    with open("ceshi003.pkl",mode="rb") as fp:
        '''
        res = pickle.load(fp)
        print(res)
        res = pickle.load(fp)
        print(res)
        res = pickle.load(fp)
        print(res)
        res = pickle.load(fp)
        print(res)
        '''
        #res = pickle.load(fp)
        #print(res)

       #是否可以把所有数据都一次性拿出来
       #try...except..抑制多调用的那一次的报
    #异常格式    

    try:
            while True:
                res = pickle.load(fp)
                print(res)

        except:
            pass

    json  pickle 两个模块的区别总结
    (1) json序列化之后的数据类型是str ,所有编程语言都识别
        但是仅限于(int float bool )(str list tuple dict None)
        json不能连续load,只能一次性拿出来所有数据
        
    (2)pickle序列化之后的呼声类型是bytes,
        所有数据类型都可以转化,但仅限于python之间的存储传输
        pickle可以连续load,多套数据放在同一个文件中

     

  • 相关阅读:
    全排列和几道例题
    NOJ1333: [蓝桥杯2017初赛]Excel地址
    力扣5-最长回文子串-(Manacher算法)
    CF1003E-Tree Constructing-(构造+dfs)
    NOJ1329:[蓝桥杯2017初赛]k倍区间-(前缀和)
    Java 时间
    小魂和他的数列-(离散+二分+树状数组)
    AC自动机入门和几道例题
    java写入加速
    清理 Excel 导出的 HTML 的多余属性
  • 原文地址:https://www.cnblogs.com/hszstudypy/p/10888554.html
Copyright © 2020-2023  润新知