• python:序列化与数据持久化


    数据持久化的方式有:

    1.普通文件无格式写入:将数据直接写入到文件中

    2.普通序列化写入:json,pickle

    3.DBM方式:shelve,dbm

    相关内容:

    • json
    • pickle
    • shelve
    • dbm

    首发时间:2018-02-23 20:52


    json:

    介绍:

    按照指定格式【比如格式是字典,那么文件中就是字典】将数据明文写入到文件中,类型是bytes的,比如”中文“就会变成Unicode编码

    image

    用法:

    • 首先要导入模块import json
    • 序列化:
      • json.dump(序列化对象,文件对象)
      • json.dumps(序列化对象),返回值是一个字符串,需要手动将这个字符串写入到文件中
        print("------json序列化--------")
        import json
        import time
        info={
            'date':time.localtime(),
            'name':'中文'
        }
        f=open("test.txt","w")
        
        print("---------dump---------")
        # json.dump(info,f)
        # f.close()
        print("---------dumps,---------")
        f.write(json.dumps(info))
        f.close()
    • 反序列化:
      • json.load(文件对象)
      • json.loads(字符串)
        print("------反序列化--------")
        import json
        f=open("test.txt","r")
        
        print("-------load----------")
        # data=json.load(f)#1
        # print(data)
        print("-------loads----------")
        d2=json.loads(f.read())
        print(d2)
        f.close()

     

    对于多次dumpdumps,如何loadloads取出来:

    • 需要在dump的时候,手动对数据进行划分
    print("------json序列化--------")
    import json
    import time
    info={
        'date':time.localtime(),
        'name':'中文'
       # 'func':hello #注:json不可序列化函数
    }
    info2=['1',2,3,4]
    f=open("test.txt","w")
    
    print("---------dumps,---------")#用'
    '来区分两份数据
    f.write(json.dumps(info)+"
    ")
    f.write(json.dumps(info2)+"
    ")
    
    f.close()
    import json
    with open("test.txt") as f:
        a=json.loads(f.readline())
        b=json.loads(f.readline())
        print(a,b)

     


    pickle:

    介绍:

    • 用于实现Python数据类型与Python特定二进制格式之间的转换
    • 参数protocol规定了序列化的协议版本,默认情况下使用pikkle序列化数据是bytes的,打开文件的方式必须为二进制格式

    用法:

    • 首先导入模块import pickle
    • 序列化:
      • pickle.dump(序列化对象,文件对象)
      • pickle.dumps(序列化对象),返回值是一个字符串,需要手动将这个字符串写入到文件中
        import pickle
        
        info={
            'name':'1',
            'age':2,
        }
        
        f=open("test2.txt","wb")
        pickle.dump(info,f)#序列化方法1
        # f.write(pickle.dumps(info))#序列化方法2
        f.close()
    • 反序列化:
      • pickle.load(文件对象)
      • pickle.loads(字符串)
        print("------反序列化--------")
        import pickle
        
        
        f=open("test2.txt","rb")
        data=pickle.loads(f.read())#反序列方法1
        print(data)
        
        
        # data=pickle.load(f)#反序列方法2
        # print(data)
        f.close()


    shelve:

    介绍:

    • 专门用于将Python数据类型的数据持久化到磁盘,操作类似于dict

    用法:

    • 首先导入模块import
    • shelve打开一个文件: shelve文件对象 = shelve.open(文件名)
    • 写入:shelve文件对象[key]=value
    • 读出:shelve文件对象.get(key)
    import shelve,time
    
    d = shelve.open('shelve_test')  # 打开一个文件
    
    print("----------写----------")
    
    info ={"name":'lilei',"sex":"man"}
    name = ["autuman", "zhangsan", "lisi"]
    
    d["teacher"] = name
    d["student"] = info
    d["date"] = time.ctime()
    
    print("--------读------------")
    print(d.get("teacher"))
    print(d.get("student"))
    print(d.get("date"))
    
    
    d.close()

    shelve可以很方便的序列化自定义的数据类型、函数:

    import shelve,time
    
    
    class A:
        def hello(self):
            print("123")
    d = shelve.open('shelve_test')  # 打开一个文件
    
    print("----------写----------")
    
    d['class'] =A
    
    print("--------读------------")
    
    a=d.get('class')()
    a.hello()
    
    d.close()


    dbm:

    介绍:

    • dbm与shelve非常类似,但dbm的键和值必须是字符串类型
    • dbm默认写入的数据是bytes的,将所有字符串都序列化成bytes的

    用法:

    • 首先导入模块imort dbm【注意的是由很多个不同的dbm,可以选择来使用,这里使用默认】
    • 打开文件:dbm对象=dbm.open(文件名,打开模式)
      • image
    • 写入:dbm对象[key]=value
    • 读取: dbm对象[key]
    import dbm
    
    db=dbm.open("test.txt","c")
    
    print("".center(50,'-'))
    db["name"]="1111111111112"
    db["name2"]="2222222222222"
    
    print("".center(50,'-'))
    print(db["name"])
    print(db["name2"])
    
    db.close()

  • 相关阅读:
    ECNU 3288 成绩计算
    ECNU 3241 字母替换
    ECNU 3243 搜索联系人
    ECNU 2977 成绩排序
    ECNU 2974 统计单词个数
    ECNU 3092 GDP
    【Codeforces Round #693 (Div. 3) D】Even-Odd Game
    【Codeforces Round #693 (Div. 3) C】Long Jumps
    【Codeforces Round #693 (Div. 3) B】Fair Division
    【Codeforces Round #693 (Div. 3) A】Cards for Friends
  • 原文地址:https://www.cnblogs.com/progor/p/8463610.html
Copyright © 2020-2023  润新知