zoukankan      html  css  js  c++  java
  • python--序列化:json、pickle、shelva

    序列化      数据类型---》str   一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀。
    反序列化    str---》数据类型
    序列化三大方法:json *****    pickle ****      shelva ***
    序列化的目的
    1、以某种存储形式使自定义对象持久化;
    2、将对象从一个地方传递到另一个地方。
    3、使程序更具维护性。
    序列化目的
    一、json
    四种方法:dumps    loads    在内存角度的操作
    dump   load   和文件操作相关是序列化操作
    优点:通用的序列化方法
    缺点:只有很少的一部分数据类型可以通过json转换:  dict  str  tuple  (set不可以)
    json
    1.dumps序列
    import json
    dic={'a':1,'m':2}
    str_d=json.dumps(dic)
    print(type(str_d),str_d)      #<class 'str'> {"m": 2, "a": 1}  str 数据类型  m  a 键值都变成了双引号
    #注意,json转换完的字符串类型的字典中的字符串是由""表示的
    dumps
    2.loads反序列化
    dic='{"a":1,"m":2}'
    dic_d=json.loads(dic)
    print(type(dic_d),dic_d)    #<class 'dict'> {'a': 1, 'm': 2}     dict数据类型
    #注意:要被反序列化的内容必须是str类型
    loads

    3. dump 序列化 和 和文件操作相关

    import json
    f=open('文件','w',encoding='utf-8')
    dic={'k':1,'k2':2,'k3':3}
    json.dump(dic,f)   #dump方法接收一个文件句柄,直接将字典转换成json字符串写入文件
    json.dump(dic,f)   #再次写入,是可以的,但是在反序列化的时候不支持一次性读取,load是一行一行的读
    f.close()
    dump
    # 不支持分次load,多次序列化写入,还要反序列化的解决方法:
    首先实现 一行一行序列化写入
    l = [{'k':'111'},{'k2':'111'},{'k3':'111'}]   #转为列表为了下面的循环
    f = open('file','w')
    import json
    for dic in l:
        str_d=json.dumps(dic)
        f.write(str_d+'
    ')
    f.close()
    其次实现反序列化实现一行写出
    import json
    f=open('file','r')
    l=[]
    for i in f :
        ret=json.loads(i.strip())
        l.append(ret)
    f.close()
    print(l)    # [{'k': '111'}, {'k2': '111'}, {'k3': '111'}]
    4.load 反序列化
    f=open('文件','w',encoding='utf-8')
    dic={'k':1,'k2':2,'k3':3}
    json.dump(dic,f)
    f=open('文件','r',encoding='utf-8')
    ret=json.load(f)  #load方法接收一个文件句柄,直接将文件中的json字符串转换成数据结构返回
    f.close()
    print(type(ret),ret)   #得到一个bytes类型的
    load
    5.ensure_ascii
    json dumps有个参数 ensure_ascii 默认是True 序列化写进文件是不看懂的byts类型,如果想看就要改成False
    import json
    f = open('file','w',encoding='utf-8')
    json.dump({'国籍':'中国'},f)
    ret = json.dumps({'国籍':'中国'})
    f.write(ret+'
    ')
    {"u56fdu7c4d": "u4e2du56fd"}{"u56fdu7c4d": "u4e2du56fd"}看不
    ensure_ascii
     更改参数ensure_ascii=False
    json.dump({'国籍':'美国'},f,ensure_ascii=False)
    ret = json.dumps({'国籍':'美国'},ensure_ascii=False)
    f.write(ret+'
    ')
    f.close()   #{"国籍": "美国"}{"国籍": "美国"}
    ensure_ascii=False
    二、pickle
    优点:可以把python中任意的数据类型序列化,  支持分次load
    缺点:pickle序列化的内容只有python能理解,且部分反序列化依赖python代码
    注释:dumps之后得到bytes类型,所以文件打开要用   wb
    四种方法:dumps    loads
    dump   load   和文件操作相关是序列化操作
    1  dumps
    dic={'a':1,'b':2,'c':3}
    str_d=pickle.dumps(dic)
    print(type(str_d),str_d)    #<class 'bytes'> b'x80x03}qx00(Xx01x00x00x00bqx01Kx02Xx01x00x00x00aqx02Kx01Xx01x00x00x00cqx03Kx03u.'
    1  loads
    ret=pickle.loads(str_d)
    print(type(ret),ret)   #<class 'dict'> {'c': 3, 'a': 1, 'b': 2}
    dumps
    2  loads
    ret=pickle.loads(str_d)
    print(type(ret),ret)   #<class 'dict'> {'c': 3, 'a': 1, 'b': 2}
    loads
    3:dump
    f=open('文件','wb')
    dic={'a':1,'b':2,'c':3}
    dic_d=pickle.dump(dic,f)
    print(dic_d)   #None
    f.close()
    dump
    4.load  #反序列化
    f=open('文件','rb')
    ret=pickle.load(f)
    print(ret)    #{'c': 3, 'b': 2, 'a': 1}
    load
    三、shelva  python3 中添加的
    序列化句柄
    使用句柄直接操作,非常方便
    加上writeback=True ,则对于字符串的任何操作都可以被记录
    import shelve
    f=shelve.open('file1')
    f['key']={'cc':1,'mm':2}
    f.close()
    序列化
    f1=shelve.open('file1')
    ret=f1['key']
    print(ret)   #{'mm': 2, 'cc': 1}
     #取出数据的时候也只需要直接用key获取即可,但是如果key不存在会报错
    f.close()
    反序列化
     1.writeback  的用法
    import shelve
    f=shelve.open('file1')
    f['key']={'cc':1,'mm':2}
    print(f['key'])       #{'cc': 1, 'mm': 2}
    f['key']['nem_name']='aaaaaaaaa'
    f.close()
    
    f1=shelve.open('file1',writeback=True)
    f1['key']['nem']='bbb'
    print(f1['key'])   #{'cc': 1, 'mm': 2, 'nem': 'bbb'}
    f1.close()
  • 相关阅读:
    面向对象编程的三大特征: 封装、继承、多态
    CDH和HDP对比
    mapreduce、spark、tez区别
    minio原理和使用
    HDP、CDH、CDP升级
    常用的分布式文件系统
    linux平台下防火墙iptables原理(转)
    php 1207
    php 1209
    php 1130
  • 原文地址:https://www.cnblogs.com/zzy-9318/p/8270758.html
Copyright © 2011-2022 走看看