• python全栈闯关--20-序列化


    序列化简介

    干什么?

    序列化:数据机构转→字符串
    反序列化:字符串→数据结构

    用途:

    数据存储
    网络上传输

    使用模块:

    • josn
    • pickle
    • shelve

    json:

      可以转换数字、字符串、列表、字典、元祖
      通用的序列化格式
      只有很少的一部分数据类型能够通过json转换成字符串

    pickle:

      所有python中的数据类型,都可以转换成字符串
      pickle序列化的内容只有python能理解
      反序列化依赖python代码

    shelve:

      序列化句柄
      使用句柄操作,非常方便

    json

    使用dumps和loads在内存中进行转换:

    d = dict([(1,'a'),(2,'b'),(3,'d')])
    print(type(d), d)
    # <class 'dict'> {1: 'a', 2: 'b', 3: 'd'}
    s_d = json.dumps(d)
    print(type(s_d), s_d)
    # <class 'str'> {"1": "a", "2": "b", "3": "d"}  字符串类型中,字符使用双引号
    dic_d = json.loads(s_d)
    print(type(dic_d), dic_d)
    # <class 'dict'> {'1': 'a', '2': 'b', '3': 'd'}  键值变成了字符,不是开始的整数

    使用dump和load在写入文件和从文件中读取:

    f = open('fff',mode='w',encoding='utf-8')
    json.dump(d,f)
    f.close()
    
    f = open('fff',mode='r')
    fd= json.load(f)
    print("%s fd:%s)" %(type(fd),fd))
    f.close()
    
    d = {1:'这个',2:'哪个'}
    f = open('fff',mode='w',encoding='utf-8')
    json.dump(d,f,ensure_ascii=True)
    # 含有中文,写入文件的内容是乱码
    # true是写入文件的是字符编码
    # false吸入文件的内容是可读的
    f.close()
    
    f = open('fff',mode='r',encoding='utf-8')
    #  读取时,不加字符编码,系统使用默认的字符加载二进制,可能会报错
    fd= json.load(f)
    print("%s fd:%s)" %(type(fd),fd))
    f.close()

    json不能多次写,但是使用文件操作和dumps、loads可以变通实现

    # json只能一次性写入,不能一次读取多行
    # 要写入存入多行,就只能使用dumps往文件写入多行,逐行读取后,使用loads转换
    l = [{'k1':'11'},{'k2':'22'},{'k3':'33'}]
    with open('多次读写.txt',mode='w', encoding='utf-8') as f:
        for d in l:
            str_dic = json.dumps(d)
            f.write(str_dic+'
    ')
    
    d_list = []
    with open('多次读写.txt',mode='r',encoding='utf-8') as f:
        for l in f:
            dic = json.loads(l.strip())
            d_list.append(dic)
    
    print(d_list)

    pikcle

    操作跟json一致,但是pickle支持多次读写,和所有的数据结构

    import pickle
    import time
    d = dict([(1,'a'),(2,'b'),(3,'d')])
    dic_str = pickle.dumps(d)
    print(type(dic_str), dic_str)
    # <class 'bytes'> b'x80x03}qx00(Kx01Xx01x00x00x00aqx01Kx02Xx01x00x00x00bqx02Kx03Xx01x00x00x00dqx03u.'
    d2 = pickle.loads(dic_str)
    print(d2)
    
    #pickle 转换后的结果未二进制的,因此读出和写入都必须使用rb模式
    # pickle可以对此写入和读出
    with open('pickle_file',mode='wb') as f:
        pickle.dump(d, f)
        pickle.dump(time.localtime(), f)
    # 存储后,文件内容是乱码
    
    with open('pickle_file',mode='rb') as f:
        d1 = pickle.load(f)
        d2 = pickle.load(f)
    print(type(d1), d1)
    print(type(d2), d2)

    shelve

    直接通过文件句柄进行操作

    print('shelve begin:'.center(50,'-'))
    import shelve
    f = shelve.open('shelve_file') # 直接对文件句柄进行操作,就可以存入数据
    f['time'] = time.localtime()
    f['name'] = ['juse', 'tom', 'lisan']
    f.close()
    
    with shelve.open('shelve_file',writeback=True) as s:
        s1 = s['time'] # key 值不存在报错
        s2 = s['name']
        s['name'][1] = 'alter edit123' # 如果不加writeback=True,对列表的修改,将不会返回给文件
    print(type(s1), s1)
    print(type(s2), s2)
  • 相关阅读:
    fstat、stat和lstat 区别
    listen()函数中的SOMAXCONN含义
    #ifndef#define#endif的用法(整理)
    stdin和STDIN_FILENO的区别(转)
    S_ISREG等几个常见的宏
    *_t 数据类型
    IO模式精细讲解: MSG_DONTWAIT 、 MSG_WAITALL
    c标准函数库(查阅使用)
    stdint.h
    C# RichTextBox控件常用屬性和事件
  • 原文地址:https://www.cnblogs.com/zxw-xxcsl/p/12660915.html
Copyright © 2020-2023  润新知