• Python 序列化之json&pickle模块


    json & pickle 模块

    用于序列化的两个模块(所谓序列化,就是把变量从内存中变成可存储或可传输的过程。序列化之后便可以存储在硬盘上,并可以传输至别的机器上,再通过反序列化,便可以获得之前的变量内容)

    • json,用于字符串 和 python数据类型间进行转换
    • pickle,用于python特有的类型 和 python的数据类型间进行转换,该模块也是python特有的模块,可以保存当前状态,俗称挂起。

    Json模块提供了四个功能:dumps、dump(序列化,存)、loads(反序列化,读)、load

    pickle模块提供了四个功能:dumps、dump(序列化,存)、loads(反序列化,读)、load  (不仅可以序列化字典,列表...还可以把一个程序,一个类给序列化掉)

    json模块

    首先,我们声明一个字典s,通过dumps方法将s进行序列化,此时可以将序列化的结果写到文本中(都是字符串的格式),即为存档。

    之后,通过loads方法对序列化后的结果进行反序列化,得到之前的变量信息s,即为读档。

    1 import json
    2 s = {"desc":"invilad-citykey", "status":1002}
    3 
    4 result = json.dumps(s)   # 序列化
    5 result1 = json.loads(result)  #反序列化
    6 
    7 print(result, type(result))
    8 print(result1, type(result1))

    执行上述代码,如下图所示,第一行是序列化的结果,可以看出,json将字典转换成一个类型为字符串格式的序列化结果;第二行是反序列化的结果,其将之前序列化的结果又转化成为字典s。

    同样,对于列表,也可以通过同样的方式进行序列化和反序列化。

    1 Company = ['ALi','tencent','BAIDU']
    2 result2 = json.dumps(Company)
    3 result3 = json.loads(result2)
    4 print(result2, type(result2))
    5 print(result3, type(result3))

    执行上述代码,如下图所示,第一行是序列化的结果,可以看出,json将列表转换成一个类型为字符串格式的序列化结果;第二行是反序列化的结果,其将之前序列化的结果又转化成为列表Company。

    dump的功能可以直接将序列化的结果写入文件中,load也可以直接从文件中读取并反序列化。

    dump:

    1 obj = ['foo', {'bar': ('baz', None, 1.0, 2)}]
    2 with open(r"c:json.txt","w+") as f:
    3     json.dump(obj, f)

    load:

    1 with open(r"c:json.txt","r") as f:
    2     print json.load(f)

    但是,当存在较为复杂的数据类型时,json却不能够很好的序列化。比如,我们在字典中添加函数:

    1 def sayhi(name):
    2     print("hello,",name)
    3 s = {"desc":"invilad-citykey", "status":1002, "func": sayhi}
    4 
    5 result = json.dumps(s)   # 序列化
    6 result1 = json.loads(result)  #反序列化
    7 
    8 print(result, type(result))
    9 print(result1, type(result1))

    执行上述代码,结果如下,显示json没有类型为函数的序列化。

    因此,JSON在python中分别由list和dict组成。

    pickle模块

    pickle模块的用法和json模块没用太大的区别,但其可以实现上述需求。

     1 import pickle
     2 
     3 def sayhi(name):
     4     print("hello,",name)
     5 s = {"desc":"invilad-citykey", "status":1002, "func": sayhi}
     6 
     7 result = pickle.dumps(s)   # 序列化
     8 result1 = pickle.loads(result)  #反序列化
     9 
    10 print(result, type(result))
    11 print(result1, type(result1))

     上述字典中包含函数,利用pickle模块可以实现序列化与反序列化。

    区别:

    1、JSON只能处理基本数据类型。pickle能处理所有Python的数据类型。

    2、JSON用于各种语言之间的字符转换。pickle用于Python程序对象的持久化或者Python程序间对象网络传输,但不同版本的Python序列化可能还有差异。

  • 相关阅读:
    Zjnu Stadium(hdu3047带权并查集)
    cocos2d-x结合cocosbuilder,不同屏幕适配小结
    分布式爬虫系统设计、实现与实战:爬取京东、苏宁易购全网手机商品数据+MySQL、HBase存储
    Generating RSA keys in PKCS#1 format in Java--转
    nodejs安装node-rsa遇到的问题及解决
    spring-redis-data的一个坑
    node-rsa加密,java解密调试
    MySQL 四种事务隔离级别详解及对比--转
    从实际案例聊聊Java应用的GC优化--转
    动态可缓存的内容管理系统(CMS)
  • 原文地址:https://www.cnblogs.com/monologuesmw/p/9483338.html
Copyright © 2020-2023  润新知