zoukankan      html  css  js  c++  java
  • Python常用模块——json & pickle

    序列化模块

    1.什么是序列化-------将原本的字典,列表等对象转换成一个字符串的过程就叫做序列化

    2.序列化的目的

      1.以某种存储形式使自定义对象持久化

      2.将对象从一个地方传递到另一个地方

      3.使程序更具维护性

    3.用于序列化的两个模块

    • json,用于字符串 和 python数据类型间进行转换
    • pickle,用于python特有的类型 和 python的数据类型间进行转换

    json

    Json模块提供了四个功能:dumps、loads、dump、load

    json对象与python对象对应关系

    python对象json对象
    dict object
    list, tuple array
    str string
    int, float number
    None null
    True/False true/fase

    代码使用

    import json
    data = {
    
        'roles':[
            {'role':'monster','type':'pig','life':50},
            {'role':'hero','type':'关羽','life':80},
        ]
    }
    str_d = json.dumps(data,ensure_ascii=False) # 序列化:将一个字典转换成一个字符串
    print(type(str_d), str_d)
    '''<class 'str'> {"roles": [{"role": "monster", "type": "pig", "life": 50}, {"role": "hero", "type": "关羽", "life": 80}]}'''
    #注意,json转换完的字符串类型的字典中的字符串是由""表示的
    
    
    dic2 = json.loads(str_d)  #反序列化:将一个字符串格式的字典转换成一个字典
    #注意,要用json的loads功能处理的字符串类型的字典中的字符串必须由""表示
    print(type(dic2),dic2)
    # <<class 'dict'> {'roles': [{'role': 'monster', 'type': 'pig', 'life': 50}, {'role': 'hero', 'type': '关羽', 'life': 80}]}
    
    f = open("json_file",'w', encoding="utf-8")
    json.dump(data,f,indent=2,ensure_ascii=False)  # dump方法接收一个文件句柄,直接将字典转换成json字符串写入文件
    f.close()
    
    f = open('json_file','r',encoding="utf-8")
    dic2 = json.load(f)  # load方法接收一个文件句柄,直接将文件中的json字符串转换成数据结构返回
    f.close()
    print(type(dic2), dic2)

    参数说明

    Serialize obj to a JSON formatted str.(字符串表示的json对象) 
    Skipkeys:默认值是False,如果dict的keys内的数据不是python的基本类型(str,unicode,int,long,float,bool,None),
    设置为False时,就会报TypeError的错误。此时设置成True,则会跳过这类key ensure_ascii:,当它为True的时候,所有非ASCII码字符显示为uXXXX序列,只需在dump时将ensure_ascii设置为False即可,此时存入json的中文即可正常显示。) indent:应该是一个非负的整型,如果是0就是顶格分行显示,如果为空就是一行最紧凑显示,否则会换行且按照indent的数值显示前面的空白分行显示,这样打印出来的json数据也叫pretty
    -printed json separators:分隔符,实际上是(item_separator, dict_separator)的一个元组,默认的就是(‘,’,’:’);这表示dictionary内keys之间用“,”隔开,而KEY和value之间用“:”隔开。 default(obj) is a function that should return a serializable version of obj or raise TypeError. The default simply raises TypeError. sort_keys:将数据根据keys的值进行排序。

    pickle

    用于序列化的两个模块

    • json,用于字符串 和 python数据类型间进行转换
    • pickle,用于python特有的类型 和 python的数据类型间进行转换

    pickle模块提供了四个功能:dumps、dump(序列化,存)、loads(反序列化,读)、load 。 (不仅可以序列化字典,列表...可以把python中任意的数据类型序列化

    import pickle,json,time
    
    dic = {'name':'alex','age':22}
    
    
    str_dic = pickle.dumps(dic)
    print(str_dic)  #一串二进制内容
    
    dic2 = pickle.loads(str_dic)
    print(dic2)    #字典
    
    
    struct_time  = time.localtime(1000000000)
    print(struct_time)
    f = open('pickle_file','wb')
    pickle.dump(struct_time,f)
    f.close()
    
    f = open('pickle_file','rb')
    struct_time2 = pickle.load(f)
    print(struct_time2.tm_year)

    既然pickle如此强大,为什么还要学json呢?
    这里我们要说明一下,json是一种所有的语言都可以识别的数据结构。
    如果我们将一个字典或者序列化成了一个json存在文件里,那么java代码或者js代码也可以拿来用。
    但是如果我们用pickle进行序列化,其他语言就不能读懂这是什么了~
    所以,如果你序列化的内容是列表或者字典,我们非常推荐你使用json模块
    但如果出于某种原因你不得不序列化其他的数据类型,而未来你还会用python对这个数据进行反序列化的话,那么就可以使用pickle

  • 相关阅读:
    最大子数组问题(分治策略实现)
    Solving the Detached Many-to-Many Problem with the Entity Framework
    Working With Entity Framework Detached Objects
    Attaching detached POCO to EF DbContext
    如何获取qq空间最近访问人列表
    Health Monitoring in ASP.NET 2.0
    problem with displaying the markers on Google maps
    WebMatrix Database.Open… Close() and Dispose()
    Accessing and Updating Data in ASP.NET: Retrieving XML Data with XmlDataSource Control
    Create web setup project that has crystal reports and sql script run manually on client system
  • 原文地址:https://www.cnblogs.com/xiao-apple36/p/8831821.html
Copyright © 2011-2022 走看看