当前位置: 首页 > 工具软件 > jsonpickle > 使用案例 >

Python学习笔记 json和pickle 模块

浦修文
2023-12-01

目录

  - 简述
  - json 模块
     有关JSON的介绍
     JSON和Python内置数据类型对照表
     常用方法及解析
  - pickle 模块
     可存储的数据类型
     常用方法及解析
     常见异常
     与 json 模块的差异

简述

  json 和 pickle 都是实现 Python 对象序列化和反序列化的模块,虽然他们都提供 dumps,dump,loads、load 四个功能,但两个模块之间存在根本上的差异。下面将详细讲解 json 和 pickle 模块

名词解释:

  序列化(pickling):我们把对象(变量)从内存中变成可存储或传输的过程称之为序列化
  反序列化(unpickling):把变量内容从序列化的对象重新读到内存里称之为反序列化

json 模块

  对于一种编程语言,要实现与其他语言之间的数据交互,就必须先把数据序列化成标准格式。在 Python 语言中,json 模块就是实现这样功能的一个模块。通过 json 模块中提供的方法,我们可以把数据在 JSON 类型和 Python 类型之间相互转化(即 在字符串和Python 数据类型之间转化),然后保存在文件中,从而实现打破平台和编程语言差异的数据交互。

有关 JSON 的介绍

  JSON 是一种轻量级的标准数据交换格式。它基于 ECMAScript(欧洲计算机协会制定的js规范)的一个子子集,采用完全独立与编程语言的文本格式来存储和表示数据。如果我们需要在不同的编程语言之间进行数据交互,那么我们就得把数据(对象)序列化成标准格式,如 JSON格式、XML格式。

  相比于 XML格式,大部分情况下 JSON 都是更好的选择,因为 JSON 表示出来就是一个字符串,可以被所有语言读取,也可以很方便地存储到本地磁盘或者通过网络传输。简单来说,通过 JSON,我们可以实现不同平台,不同编程语言之间的数据交互。

想了解更多 JSON 介绍请点击这里

JSON和Python内置数据类型对照表
  1. 序列化对照表
Python 类型JSON 类型
dictobject {}
list,tuplearray []
strstring " "
int,floatnumber
True,Falsetrue,false
Nonenull
  1. 反序列化对照表
JSON 类型Python 类型
object {}dict
array []list
string " "str
number(int)int
number(real)float
true,falseTrue,False
nullNone

PS:JSON 类型中,字符串使用双引号包裹的,不能用单引号;三个字面值(true,false,null)都是小写

常用方法及解析
    dump(obj, fp, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None,
        indent=None, separators=None, default=None, sort_keys=False, **kw)

        功能:将 obj 序列化为 JSON 格式的字符串,并保存到 fp 文件中

        参数:
            obj: 表示可被 JSON 格式序列化的对象
            fp: 是一个支持 write() 方法的文件对象

            sort_keys:如果 sort_keys 是 True(默认为 False),那么字典会以键的字典序保存在文件中。
            
            skipkeys: 如果 skipkeys 是 True (默认为 False),那么那些不是基本对象(包括 str, int、float、bool、None)的字典的键会被跳过,否则引发一个 TypeError。
            
            ensure_ascii: 如果 ensure_ascii 是 True (即默认值),则输出将保证把所有输入的非 ASCII 字符转义;如果 ensure_ascii 是 False,这些字符会原样输出。
            
            check_circular: 如果 check_circular 是 False (默认为 True),那么容器类型的循环引用检验会被跳过并且循环引用会引发一个 OverflowError (或者更糟的情况)
            
            allow_nan: 如果 allow_nan 是 False(默认为 True),那么在对严格 JSON 规格范围外的 float 类型值(nan、inf 和 -inf)进行序列化时会引发一个 ValueError。如果 allow_nan 是 true,则使用它们的 JavaScript 等价形式(NaN、Infinity 和 -Infinity)。
            
            indent:如果 indent 是一个非负整数或者字符串,那么 JSON 数组元素和对象成员将以该缩进级别进行漂亮打印(在文件内)。如果缩进级别为 0、负数或空字符串,则只会插入换行符。 None 是最紧凑的表示形式。
            
            default: default可以是一个函数(默认为 NOne),每当某个对象无法被序列化时它会被调用。它应该返回该对象的一个可以被 JSON 编码的版本或者引发一个 TypeError。如果没有被指定,则会直接引发 TypeError。
            
            separators:表示分隔符,如果不为空,那么他应该是一个二元组:(item_separator, key_separator),两个元素分别表示键值对之间的分隔符和键和值之间的分隔符
            
            cls:默认为空,可以是 JSONEncoder 的子类,该参数通过关键字参数来指定

        返回值:None


    dumps(obj,skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None,
        separators=None, default=None, sort_keys=False, **kw)

         功能:将 obj 序列化为 JSON 格式的字符串
         参数:各参数的含义与 dump() 中的相同
         返回值:一个字符串

         说明:1、该方法会将包裹字符串的单引号换成双引号,因为 JSON 中的字符串被双引号包裹
              2、如果 obj 具有非字符串的键,则 loads(dumps(obj)) != obj。因为 JSON 中的键值对中的键永远是 str 类型的,
             当一个对象被转化为 JSON 时,字典中所有的键都会被强制转换为字符串。这所造成的结果是字典被转换为 JSON 然后转换回字典时可能和原来的不相等

    load(fp, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)
        
        功能:将 fp 反序列化为 Python 对象。

        参数:
            fp:表示支持 .read() 方法的文件对象(包含 JSON 文档)

            object_hook:这是一个可选函数,它会被调用于每一个解码出的对象字面量(即一个 dict)。object_hook 的返回值会取代原本的 dict。这一特性能够被用于实现自定义解码器
            
            object_pairs_hook:与 object_hook 参数基本相同,但它是被有序列表解码的结果调用,如果它与 object_hook 同时被定义,则优先使用 object_pairs_hook
            
            parse_int:可以是一个函数,如果指定了 parse_int,则将使用每个要解码的 JSON int 的字符串进行调用。 默认情况下,这等效于int(num_str)
            
            parse_float:可以是一个函数,如果指定了 parse_float,将使用每个要解码的 JSON float 的字符串来调用。 默认情况下,这等效于float(num_str)
            
            parse_constant:可以是一个函数,,如果指定了 parse_constant,将使用以下字符串之一调用它:'-Infinity','Infinity','NaN'。 如果遇到无效的JSON数字,则可以使用此方法引发异常。另,它不再在'null','true','false'上调用
            
            cls:可以是 JSONDecoder 的子类,通过关键字参数指定

        返回值:相应的对象

    loads(s, *, encoding=None, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)
        
        功能:反序列化 s 到 Python 对象
        参数:
            s:表示一个包含 str, bytes或bytearray 对象的 JSON 文档(字符串)
            其他参数的含义与 load() 中相同

        返回值:相应的对象
        说明:loads 不能识别单引号,如果 s 中包含单引号(如:s="{'k': '123'}"),就会抛出 JSONDecodeError 异常


常见异常:
    JSONDecodeError:如果要反序列化的数据不是有效的JSON文档,则将引发 JSONDecodeError

pickle 模块

  pickle 模块实现了用于 Python 对象结构进行序列化和反序列化的二进制协议。通过 pickle 模块的序列化操作,我们能将程序中运行的对象层次结构转化成字节流,然后保存到二进制文件中去。

  与 json 不同,pickle 所使用的数据格式是特定于 Python 的,所以它只能用于 Python 特有的类型和 Python 的数据类型之间的转换。另外,pickle 并不如 json 那样安全。

可存储的数据类型
  1. 所有基本类型:int、float、complex、str、bytes、bytearray、True、False、None
  2. 由 1 中数据组成的 list、tuple、dict、set
  3. 3、在模块顶层定义的函数(使用 def 定义)、内置函数、类和类的实例
常用方法及解析
pickle.dump(obj, file, protocol=None, fix_imports=True)
            功能:将 obj 以字节的形式写入 file
            参数:
                obj:表示要序列化的对象
                file:表示 obj 要写入的文件对象,file 必须以二进制可写模式打开,即 'wb'
                protocol:表示告知 pickler 使用的协议,支持的协议有 0,1,2,3,默认的协议是协议 3
                fix_imports:如果 fix_imports 为 True 并且协议小于 3,则 pickle 将尝试将新的 Python 3名称映射到 Python 2中使用的旧模块名称,以便 pickle 数据流可被Python 2读取

            返回值:None

        dumps(obj, protocol=None, fix_imports=True)
            功能:以字节对象形式返回序列化的对象,不需要写入文件中
            参数:各参数含义与 dump() 中相同
            返回值:一个 bytes 对象


        load(file, fix_imports=True, encoding='ASCII', errors='strict')
            功能:从 file 中读取数据并返回给 Python 对象
            参数:file:表示一个以二进制可读模式(即 'rb')打开的文件对象
            返回值:相应的对象
            说明:另外三个可选参数用于控制对 Python 2生成的 pickle 流的兼容性支持

        loads(bytes_object, fix_imports=True, encoding='ASCII', errors='strict')
            功能:从字节对象中读取被序列化的对象,并返回
            参数:bytes_object 表示一个字节对象
            返回值:相应的对象
常见异常
  1. PickleError:序列化和反序列化时出现问题引发的异常,继承自 Exception
  2. UnPicklingError: 反序列化对象过程中出现出现问题(例如数据损坏)引发的异常,继承自 PickleError
  3. PicklingError: 当遇到不可序列化的对象时引发的异常,继承自 PickleError
与 json 模块的差异
  1. JSON 是一种文本序列化格式,而 pickle 是一种二进制序列化格式。
  2. JSON 是人类可读且易读的,而 pickle 人类不可读。
  3. JSON 是可互操作的,且在 Python 生态环境之外被广泛使用,而 pickle 是特定于 Python 的。
  4. 默认情况下,JSON 只能表示 Python 内置类型的子集,不能表示自定义类,而 pickle 表示大量的 Python 类型。
  5. JSON 比 pickle 更安全
 类似资料: