zoukankan      html  css  js  c++  java
  • Pythoy 数据类型序列化——json&pickle 模块

    Pythoy 数据类型序列化——json&pickle 模块

    TOC

    • 什么是序列化/反序列化
    • pickle 模块
    • json 模块
    • 对比json和pickle
    • json.tool 命令行接口

    什么是序列化/反序列化?

    就是将内存中的数据类型变成可存储或传输的东西,这一过程叫做序列化,在python中叫pickling,在其它语言叫 serialization,marshalling,flattening等,其实base64转码也可叫做序列化,因为很多文本协议如http,smtp都是只支持ascii编码传输。
    序列化之后可以将内容写入磁盘,或通过网络传输到其它机器。
    反序列化就是序列化的逆过程,unpickling

    __Python__提供了两个模块来进行序列化操作,分别是pickle和json

    pickle模块

    pickle是python语言专属的序列化方式。
    pickle模块可以将python中的任何数据类型进行序列化,并序列化为bytes类型。
    pickle模块提供的方法

    • dump(obj, fp) 将obj序列化后直接写入fp对象中
    • dumps(obj) 将obj序列化为bytes,方法return该bytes对象
    • load(fp) 从fp中读取序列化bytes对象并反序列化
    • loads(bytes) 将bytes反序列化
      实践:
    import pickle
    with open('test.pkl', 'wb') as fp:  # 注意因为pickle序列化后是bytes所以file-object 能够写入二进制,那么open的打开方式就必须是二进制方式'wb'。
    	pickle.dump({'a': 1, 'b': 2}, fp)
    
    with open('test.txt', 'rb') as fp: # 同样读取也是要是一个binary file-object
    	print(pickle.load(fp))
    
    • 助记:dumps带s就是序列化为string,dump不带s就是序列化为string后直接写入fp。load和loads也一样这样记。
    • 如果pickle序列化写入文件,那么这个文件后缀最好用.pkl或.pk,辨识度高

    json模块

    json不多说,是数据交换的一种格式。叫 json document
    json模块方法和pickle类似:

    • dump(obj, fp) 将obj序列化后直接写入fp对象中,由于序列化后的json是字符串,所fp必须是text Stream类型
    • dumps(obj) 将obj序列化为json字符串,方法return该json字符串
    • load(fp) 从fp中读取json并反序列化 ,这个就不要求fp是text Stream类型,也就是从文件中既可以读取bytes,也可以string。
    • loads(obj) 将json反序列化,可以是json的字符串或bytes 或bytearray
    • 注意,tuple元组的序列化会会编程json的array数组,如果再进行deserialize就编程了列表而不是元组。
      实验:
    import json
    
    i = 10
    s = 'hello world!'
    t = (1,)
    l = [10, 'hello world!', ['a', 'b'], {'a': 1, 'b': 2}]
    d = {'a': 1, 'b': 2, 'c': l}
    
    print(json.dumps(i))
    print(json.dumps(s))
    print(json.dumps(t))
    print(json.dumps(l))
    print(json.dumps(d))
    
    with open('test.json', 'w') as fp:
        json.dump(l, fp)
    
    with open('test.json', 'rb') as fp:
        print(json.load(fp))
    
    print(json.loads(b'[10, "hello world!", ["a", "b"], {"a": 1, "b": 2}]'))
    

    结果:

    10
    "hello world!"
    [1]
    [10, "hello world!", ["a", "b"], {"a": 1, "b": 2}]
    {"a": 1, "b": 2, "c": [10, "hello world!", ["a", "b"], {"a": 1, "b": 2}]}
    [10, 'hello world!', ['a', 'b'], {'a': 1, 'b': 2}]
    [10, 'hello world!', ['a', 'b'], {'a': 1, 'b': 2}]

    对比json和pickle

    json

    • 在python中一般只能序列化int/str/list/dict
    • 跨语言

    pickle

    • 能序列化python任何对象
    • 只能在python中使用

    json.tool 命令行接口

    json.tool提供在命令行对json字符串进行json格式校验和漂亮打印pretty-print

    用法:
    :> echo '{"josn": "obj"}' | python -m json.tool
    {
    "json":"obj"
    }
    :> python -m json.tool mp_films.json # 后面跟json文件

  • 相关阅读:
    草稿~!
    Jmeter使用:JSON返回数据处理
    Jmeter使用:操作MySQL
    jmeter+ant+jenkins 搭建接口自动化测试环境
    【未完成】Jmeter接口自动化测试:参数化设置
    RDLC报表系列(六) 多图表-折线图和柱状图
    RDLC报表系列(五) 简单的图表-柱状图
    RDLC报表系列(四) 矩阵
    流程图里的形状符号的含义及意义(转 )
    Login failed for user 'NT AUTHORITYNETWORK SERVICE'的解决方法
  • 原文地址:https://www.cnblogs.com/ZJiQi/p/8944910.html
Copyright © 2011-2022 走看看