zoukankan      html  css  js  c++  java
  • python序列化数据

    在python中序列化数据可以使用两种不同模块,一种是json格式,另一种是pickle模块!

    序列化的概念:

    序列化:将对象的状态信息转换为可以存储或可以通过网络传输的过程,传输的格式可以是JSON,XML等。

    反序列化就是从存储区域(JSON,XML)读取反序列化对象的状态,重新创建该对象。

    JSON模块

    json是一种在各个通用的格式,因此可以跨语言之间的去传递数据。

    json:一种轻量级数据交互格式,相对于XML而言更简单,也易于阅读和编写,机器也方便解析和生成,json是javascript的一个子集。

    python的json模块序列化与反序列化的过程分别是encoding和decoding。

    • encoding:把一个python对象编码转换成Json字符串,对应的方法是load和loads。
    • decoding:把json格式字符串编码转换成python对象,对应的方法是dump和dumps。

    json模块提供了四个方法:dump , load, dumps, loads

    json的dumps方法与loads方法:dumps把python对象格式化为json字符串保存在变量中,loads方法把json字符串反序列化为python对象。

    # dumps功能
    # 将数据通过特殊的形式转换为所有程序语言都认识的字符串
    In [2]: data = ["a","bb","ccc"]
    
    In [3]: j_data = json.dumps(data)
    
    In [4]: j_data
    Out[4]: '["a", "bb", "ccc"]'
    
    In [5]: type(j_data)
    Out[5]: str
    
    # loads功能
    # 将json编码的字符串再转换为python的数据结构
    In [6]: meg = json.loads(j_data)
    
    In [7]: meg
    Out[7]: [u'a', u'bb', u'ccc']
    
    In [8]: type(meg)
    Out[8]: list

    dump与load的功能与上面的一样,只不过是把数据保存在文件中。

     # dump功能
     # 将数据通过特殊的形式转换为所有程序语言都认识的字符串,并写入文件
     In [11]: with open("/tmp/tmp.json","wr") as fd:
       ....:     json.dump(data,fd)
       ....: 
    [root@db2 tmp]# cat tmp.json 
    ["a", "bb", "ccc"]
    [root@db2 tmp]#
    
    # load功能
    # 从数据文件中读取数据,并将json编码的字符串转换为python的数据结构
    In [1]: import json
    
    In [2]: fd = open("/tmp/tmp.json","r")
    
    In [3]: data = json.load(fd)
    
    In [4]: data
    Out[4]: [u'a', u'b', u'c']  #注意编码格式

    对于字典,json会假设key是字符串(字典中的任何非字符串key都会在编码时转换为字符串),要符合JSON规范,应该只对python列表和字典进行编码。此外,在WEB应用中,把最顶层对象定义为字典是一种标准做法。
    json编码的格式几乎和python语法一致,略有不同的是:True会被映射为true,False会被映射为false,None会被映射为null,元组()会被映射为列表[],因为其他语言没有元组的概念,只有数组,也就是列表。

    一些参数使用(摘录):

    • ensure_ascii 默认为True,保证转换后的json字符串中全部是ascii字符,非ascii字符都会被转义。如果数据中存在中文或其他非ascii字符,最好将ensure_ascii设置为False,保证输出结果正常。
    • indent 缩进,默认为None,没有缩进,设置为正整数时,输出的格式将按照indent指定的半角空格数缩进,相当实用。
    • separators 设置分隔符,默认的分隔符是(',', ': '),如果需要自定义json中的分隔符,例如调整冒号前后的空格数,可以按照(item_separator, key_separator)的形式设置。
    • sort_keys 默认为False,设为True时,输出结果将按照字典中的key排序。
    data
    Out[23]: {'a': True, 'b': False, 'c': None, 'd': (1, 2), 1: 'abc', 'cn': ['中国-北京']}
    
    jdata1 = json.dumps(data)  #使用默认参数
    
    print(jdata1)
    {"a": true, "b": false, "c": null, "d": [1, 2], "1": "abc", "cn": ["u4e2du56fd-u5317u4eac"]}
    
    jdata2 = json.dumps(data,ensure_ascii=False, indent=4) #修改参数
    
    print(jdata2)
    {
        "a": true,
        "b": false,
        "c": null,
        "d": [
            1,
            2
        ],
        "1": "abc",
        "cn": [
            "中国-北京"
        ]
    }

    pickle模块的使用

    json模块是各种编程语言通用的数据格式,pickle是python自带的序列化格式。

    在python2中有pickle和cpickle两个模块,在python3中只有pickle一个模块。

    pickle对应的也有四个方法和dump和load, dumps和loads。

    In [1]: l1 = [1,2,3]
    
    In [2]: l2 = ["a","c","d"]
    
    In [3]: l3 = {1:"a", 2:"c", 3:"d"}
    
    In [5]: fd = open("pickle.kpi", "a")  
    
    In [6]: import pickle  #按顺序把三个列表序列化到文件中
    
    In [8]: pickle.dump(l1,fd)
    
    In [9]: pickle.dump(l2,fd)
    
    In [10]: pickle.dump(l3,fd)
    
    In [11]: fd.close()
    
    In [12]: fd = open("pickle.kpi", "r") 
    
    In [13]: s1 = pickle.load(fd)  #注意反序列化时,读出列表的顺序,遵循先进先出的原则
    
    In [14]: s1
    Out[14]: [1, 2, 3]
    
    In [16]: s2 = pickle.load(fd)
    
    In [17]: s2
    Out[17]: ['a', 'c', 'd']
    
    In [19]: s3 = pickle.load(fd)
    
    In [20]: s3
    Out[20]: {1: 'a', 2: 'c', 3: 'd'}
  • 相关阅读:
    ANSYS文件读写
    ANSYS导出图片
    由面网格拉伸为体网格
    ANSYS由结点生成单元
    photoshop做gif图片的问题
    matlab输出没有白边的图片
    关于ANSYS绘图显示结果范围的问题
    ansys的建模基于的坐标系问题
    ANSYS分析轴对称问题
    ANSYS取消坐标轴显示,关闭局部坐标系
  • 原文地址:https://www.cnblogs.com/wxzhe/p/8949331.html
Copyright © 2011-2022 走看看