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

    一、介绍

    1、分类

    序列化:

    数据类型->字符串

    反序列化

    字符串->数据类型

    2、作用

    文件传输和文件储存需要将数据类型转换成字符串

    二、序列号模块分类

    1、json

    优点:编程语言中的英语,同用语言

    缺点:数据类型少:数字、字符串、列表、字典、元祖(通过列表进行的)

    2、pickle

    优点:python的所有数据类型

    缺点:不通用,只能在python中使用

    3、shelve

    优点:操作简单,只要使用序列化句柄操作即可

    缺点:不成熟

    三、json模块

    1、dumps() 和 loads() 方法

    import json
    dic = {'k1': 'v1'}
    """
    dic->str,使用dumps()方法,在内存中序列化
    str->dic,使用loads()方法,在内存中反序列化
    """
    str_d = json.dumps(dic)
    print(str_d, type(str_d))
    dic_d = json.loads(str_d)
    print(dic_d, type(type))
    """
    结果:
    {"k1": "v1"} <class 'str'>
    {'k1': 'v1'} <class 'type'>
    """

    2、dump() 和 load() 方法

    import json
    dic = {'k1': 'v1'}
    """
    json.dump(数据, 文件),序列化
    json.load(文件),反序列化
    """
    with open(file='abc', mode='w', encoding='utf-8') as f1:
        json.dump(dic, f1)
    
    with open(file='abc', mode='r', encoding='utf-8') as f1:
        ret = json.load(f1)print(ret, type(ret))   # {'k1': 'v1'} <class 'dict'>

    3、在文件中,一行一行序列化,一行一行反序列化,必须用dumps()和loads()方法

    import json
    li = [{'k1': 'v1'}, {'k2': 'v2'}, {'k3': 'v3'}]
    new_li = []
    """
    1.使用dumps()方法,li->str,并写入文件-逐行写入
    2.使用loads()方法,str->li,并读取文件-逐行读取
    """
    f = open('cv', mode='w', encoding='utf-8')
    for i in li:
        s = json.dumps(i)
        f.write(s + '
    ')
    f.close()
    f1 = open('cv', mode='r', encoding='utf-8')
    for line in f1:
        s0 = json.loads(line.strip())
        new_li.append(s0)
    print(li)
    f.close()

    ensure_ascii 默认参数为 False时,可以写中文

    四、pickle模块

    1、用法和json模块相似

    2、区别

    1)在使用dump()和load()方法,序列化和反序列化时,文件的mode要加b

    2)在使用dump()和load()方法时,文件可以逐行序列化和反序列化,json不可以

    import pickle
    import time
    s_time1 = time.localtime(1000000000)
    s_time2 = time.localtime(2000000000)
    f = open('pickle_file1', 'wb')
    pickle.dump(s_time1, f)
    pickle.dump(s_time2, f)
    f.close()
    f = open('pickle_file1', 'rb')
    s_time1 = pickle.load(f)
    s_time2 = pickle.load(f)
    print(s_time1.tm_year)
    print(s_time2.tm_year)
    f.close()

    五、shelve模块

     不常用

    import shelve
    f = shelve.open('shelve_file')
    f['key'] = {'int': 10, 'float': 9.5, 'string': 'Sample data'}  # 直接对文件句柄操作,就可以存入数据
    f.close()
    
    f1 = shelve.open('shelve_file')
    existing = f1['key']  # 取出数据的时候也只需要直接用key获取即可,但是如果key不存在会报错
    f1.close()
    print(existing)

     ps:涉及到反序列化的问题,用双引号

  • 相关阅读:
    lower_bound &&upper_bound
    二分/三分
    $qsort$
    define
    typedef
    string
    queue
    nyoj Arbitrage (Bellman-Ford)
    nyoj 谍战 (最小割最大流)
    nyoj 网络的可靠性(。。。)
  • 原文地址:https://www.cnblogs.com/wt7018/p/10897098.html
Copyright © 2011-2022 走看看