zoukankan      html  css  js  c++  java
  • python 序列化模块

    一. json 模块 :

    import json
    # json.dump()/dumps() 字典的key必须是字符串格式,如果key是数字,会强制转换为字符串格式
    # json.load()/loads() 操作的字符串必须是""符号,
    # dic = {1:2,3:4}
    # a = json.dumps(dic) #将传入的数据类型转换为字符串,即序列化
    # # print(a)  

    # b = json.loads(a) #将序列化的字符串反序列化,反序列化的字典中的key也为字符串 # print(b)
    # dic1 = {(1,2,3):'a','q':4}
    # a = json.dumps(dic1)    #序列化字典时,如果key为元组,不可序列化
    # print(a)    #报错
    # dic1 = {'a':(1,2,3),'q':4}
    # b = json.dumps(dic1)    #序列化字典时,如果value为元组,序列化会将元组转换为列表
    # print(b)    
    
    # lst =[1,2,3,4,[5,[6]]]  #可以查理嵌套的数据类型
    # a = json.dumps(lst) #序列化
    # print(a,type(a))
    # print(json.loads(a),type(json.loads(a)))    #反序列化     
    
    # with open('aaa.txt',mode='w') as f:
    #     t = (1,2,3,456,7)
    #     json.dump(t,f)  #序列化一个元组,并且直接写入文件
    # with open('aaa.txt', mode='r') as f:
    #     a = json.load(f)    #反序列化,并且读取
    #     print(a,type(a))    
    
    #写入数据到文件
    # t = (1,2,3,456,7)
    # dic1 = {'a':(1,2,3),'q':4}
    # with open('aaa.txt',mode='w') as f: #可以序列化多个数据并且写入文件,但是读不出来
    #     json.dump(t,f)
    #     f.write('
    ')
    #     json.dump(dic1,f)
    #     f.write('
    ')
    # with open('aaa.txt',mode='r') as f:
    #     a = json.load(f)
    #     print(a)
    #多个文件写入需要用dumps 和 loads
    # with open('aaa.txt',mode='w') as f:
    #     json.dumps(t)
    #     json.dumps(dic1)
    #     f.write(json.dumps(t) + '
    ')
    #     f.write(json.dumps(dic1) + '
    ')
    # with open('aaa.txt', mode='r') as f:
    #     for i in f:   #遍历文件句柄
    #         s = json.loads(i)   #对每一行的字符串反序列化
    #         print(s,type(s))
    
    
    # 含有中文的序列
    dic = {'':'','':'han'}
    # ret = json.dumps(dic)#序列化成编码组成的字符串
    # ret1 = json.dumps(dic,ensure_ascii=False)#ensure_ascii:当它为True的时候,所有非ASCII码字符显示为uXXXX序列,只需在dump时将ensure_ascii设置为False即可,此时存入json的中文即可正常显示。
    # print(ret,type(ret))
    # print(ret1,type(ret1))
    
    # with open('aaa.txt', mode='w') as f:
    #     json.dump(dic,f)#以编码形式写入文件  

    # with open('aaa.txt', mode='r') as f: # print(json.load(f))#不影响读取 # json的其他参数,是为了用户看的更方便,但是会相对浪费存储空间 # data = {'username':['李华','二愣子'],'sex':'male','age':16} # json_dic2 = json.dumps(data,sort_keys=True,indent=4,separators=(',',':'),ensure_ascii=False) # print(json_dic2,type(json_dic2)) #sort_keys 排序 # indent 缩进 # separators(a,b) a为元素之间的间隔符,b为键值对之间的间隔符

    二. pickle模块

    import pickle
    # dump的结果是bytes,dump用的f文件句柄需要以wb的形式打开,load所用的f是'rb'模式
    # 支持几乎所有对象的序列化
    # 对于多次dump/load的操作做了良好的处理
    
    # dic = {'姓':'王','名':'han'}
    # print(pickle.dumps(dic))    #序列化成bytes
    # print(pickle.loads(pickle.dumps(dic)))#反序列化
    # print(type(pickle.dumps(dic)))
    # print(type(pickle.loads(pickle.dumps(dic))))#
    
    # with open('aaa.txt',mode='wb') as f:
    #     pickle.dump(dic,f)  #序列化后存入文件,存入的内容乱码,目前没有解决办法
    # with open('aaa.txt',mode='rb') as f:
    #     print(pickle.load(f))
    
    # 对于实例化对象的序列化需要这个对象对应的类在内存中
    # class A:
    #     def __init__(self,name,age):
    #         self.name = name
    #         self.age = age
    # 
    # p = A('王','18')
    # with open('aaa.txt',mode='wb') as f:
    #     pickle.dump(p,f)
    # with open('aaa.txt',mode='rb') as f:
    #     print(pickle.load(f).name)

    注意 :

    json是一种所有的语言都可以识别的数据结构。
    如果我们将一个字典或者序列化成了一个json存在文件里,那么java代码或者js代码也可以拿来用。
    但是如果我们用pickle进行序列化,其他语言就不能读懂这是什么了~
    所以,如果你序列化的内容是列表或者字典,非常推荐你使用json模块
    但如果出于某种原因你不得不序列化其他的数据类型,而未来你还会用python对这个数据进行反序列化的话,那么就可以使用pickle

    三. shelve模块

    import shelve
    dic = {'':'','':'han'}
    f = shelve.open('aaa')  #自动生成三个非txt文件,文件名自己定
    f['h'] = dic    #以用户添加的key 存入文件序列
    f.close()
    
    f = shelve.open('aaa')
    c = f['h']  #以存入时的key 取出存入的序列
    f.close()
    print(c)
  • 相关阅读:
    MySQL协议分析(2)
    MySQL协议分析(1)
    《汇编语言》知识重点总结
    opencv学习(1.2)
    CentOS 6下OpenCV的安装与配置
    python2与python3之间的主要区别
    python-PEP8编码规范
    解决windows 10无法打开.hlp帮助文件的问题
    将windows server 2016改造为像windows 10一样适合个人使用的系统
    系统分析师成长之路
  • 原文地址:https://www.cnblogs.com/dong-/p/9451057.html
Copyright © 2011-2022 走看看