zoukankan      html  css  js  c++  java
  • json&pickle序列化

    一、用途

      我们需要将内存中的数据进行序列化,即写入文件中时,写入的类型只能是字符串或者二进制类型。但是如果我们想要将复杂一些的数据类型,如:列表、字典或者函数之类的同样进行序列化,我们就要用到 json或者pickle。

    二、json序列化

    1、dumps序列化和loads反序列化

    dumps把数据类型转换成字符串

    import json
    
    info = {
        'name': 'The Count of Monte Cristo',
        'type': 'Movie'
    }
    
    data = json.dumps(info)
    print(data)
    print(type(data))
    
    # 输出
    {"name": "The Count of Monte Cristo", "type": "Movie"}
    <class 'str'>
    

    loads把字符串转换成数据类型 

    import json
    
    get_info = json.loads(data)
    print(get_info['name'])
    print(get_info)
    print(type(get_info))
    
    #输出
    The Count of Monte Cristo
    {'name': 'The Count of Monte Cristo', 'type': 'Movie'}
    <class 'dict'> 

    2.dump序列化和load反序列化

    dump把数据类型转换成字符串并存储在文件中

    import json
    
    info = {
        'name': 'The Count of Monte Cristo',
        'type': 'Movie'
    }
    
    with open("test.txt", "w", encoding="utf-8") as f:
        json.dump(info, f)  # 第一个参数是内存中的数据对象,第二个参数是文件句柄
    
    #写入文件中的内容
    {"name": "The Count of Monte Cristo", "type": "Movie"}
    

    load把文件打开从字符串转换成数据类型

    import json
    
    
    with open("test.txt", "r", encoding="utf-8") as f:
        data_from_file = json.load(f)
    
    print(data_from_file['name'])
    print(data_from_file)
    print(type(data_from_file))
    
    #输出
    The Count of Monte Cristo
    {'name': 'The Count of Monte Cristo', 'type': 'Movie'}
    <class 'dict'>
    

      

    3.json序列化一个函数

    import json
    
    def test(name):
        print("hello,{}".format(name))
    
    info = {
        'name': 'The Count of Monte Cristo',
        'type': 'Movie',
        'func': test
    }
    
    data = json.dumps(info)
    
    #输出
     File "G:/python/untitled/study6/json&pickle模块.py", line 22, in <module>
        data = json.dumps(info)
      File "G:pythoninstalllibjson\__init__.py", line 230, in dumps
        return _default_encoder.encode(obj)
      File "G:pythoninstalllibjsonencoder.py", line 198, in encode
        chunks = self.iterencode(o, _one_shot=True)
      File "G:pythoninstalllibjsonencoder.py", line 256, in iterencode
        return _iterencode(o, 0)
      File "G:pythoninstalllibjsonencoder.py", line 179, in default
        raise TypeError(repr(o) + " is not JSON serializable")
    TypeError: <function test at 0x0000021B13C57F28> is not JSON serializable
    

    1、json只能处理简单的数据类型,例如:字典、列表、字符串等,不能处理函数等复杂的数据类型。

    2、json是所有语言通用的,所有语言都支持json,如果我们需要python跟其他语言进行数据交互,那么就用json格式

     

    三、pickle序列化

    pickle的用法和上面的相同,但是pickle序列化后的数据类型是二进制的,并且pickle只能在python中是使用。pickle序列化的是字节,而json序列化的是字符。

    1.dumps && loads

    import pickle
    
    
    def test(name):
        print("hello,{}".format(name))
    
    info = {
        'name': 'The Count of Monte Cristo',
        'type': 'Movie',
        'func': test
    }
    
    data = pickle.dumps(info)
    print(data)
    print(type(data))
    
    #输出
    b'x80x03}qx00(Xx04x00x00x00nameqx01Xx19x00x00x00The Count of Monte Cristoqx02Xx04x00x00x00typeqx03Xx05x00x00x00Movieqx04Xx04x00x00x00funcqx05c__main__
    test
    qx06u.'
    
    <class 'bytes'>
    
    import pickle
    
    get_data = pickle.loads(data)
    get_data['func']('cat')
    print(get_data)
    
    #输出
    hello,cat
    {'name': 'The Count of Monte Cristo', 'type': 'Movie', 'func': <function test at 0x00000235350A7F28>}
    

      

    2. dump && load

    import pickle
    
    
    def test(name):
        print("hello,{}".format(name))
    
    info = {
        'name': 'The Count of Monte Cristo',
        'type': 'Movie',
        'func': test
    }
    
    with open('test.txt', 'wb') as f:
        pickle.dump(info, f)
    
    # 写入test.txt文件中的内容
    
    �}q (X   typeqX   MovieqX   funcqc__main__
    test
    qX   nameqX   The Count of Monte Cristoqu.
    

      

    import pickle
    
    with open('test.txt', 'rb') as f:
        get_data = pickle.load(f)
    print(get_data)
    
    # 输出
    
    {'name': 'The Count of Monte Cristo', 'func': <function test at 0x000001BA2AB4D510>, 'type': 'Movie'}
    

      

    总结:

    • json值支持简单的数据类型,pickle支持所有的数据类型。
    • pickle只能支持python本身的序列化和反序列化,不能用作和其他语言做数据交互,而json可以。
    • pickle序列化的是整个的数据对象,所以反序列化函数时,函数体中的逻辑变了,是跟着心的函数体走的。
  • 相关阅读:
    solr部署长命版后继
    reiserfs相关
    sqlite in python
    查看文件系统
    https://wiki.fourkitchens.com/dashboard.action这个技术wiki不错
    gvim菜单显示问题
    linux tips
    solr部署一气呵成版,让你多活两天
    挺好玩的C语句
    hardy ubuntu source list
  • 原文地址:https://www.cnblogs.com/bigberg/p/7133747.html
Copyright © 2011-2022 走看看