Python常用标准库详解(pickle序列化和JSON序列化)

目录
  • 常用的标准库
    • 序列化模块
      • 序列化和反序列化
      • 使用场景
      • dumps & loads
      • dump & load
    • JSON序列化模块
      • 使用场景
      • 支持的数据类型
      • JSON和pickle的区别
      • 序列化函数
      • json和pickle实际使用过程中的一些问题
    • pickle和json的区别总结

常用的标准库

序列化模块

import pickle

序列化和反序列化

把不能直接存储的数据变得可存储,这个过程叫做序列化。把文件中的数据拿出来,回复称原来的数据类型,这个过程叫做反序列化。

在文件中存储的数据只能是字符串,或者是字节流,不能是其它的数据类型,但是如果想要将其存储就需要序列化。

Python中的序列化模块叫做 pickle,PHP等其它的一些语言将其称作serialize 或者unserialize,每个语言的序列化功能可以序列化它本身的一切数据类型。

使用场景

现在存在一段数据,现在并不需要他,但是说不定什么时候我就要用它,那么最好的方法就是将这段数据保存起来。

保存这段数据一般来说有那么几种方法(入库或者保存文件),但是这段数据很复杂,而保存在数据库中需要特定的数据格式,入库的话就非常的麻烦了,而且我不想破坏数据的原有格式,那么可以选择保存为文件。

如下所示:保存文件会遇到种种的麻烦问题。

# 这是我想要保存的一段数据
lst = ['A', 'B', 'C']
# 直接使用open函数不能将非字符串和非字节流的数据写入文件
with open('data.txt', 'w', encoding='UTF-8') as fp :
    fp.write(lst)
# !!! TypeError
# 将数据变成字符串就破坏了原有的数据结构(如果很复杂的数据结构几乎没有复原的可能性)
lst = str(lst)
# 将数据变成字节流:只能将字符串变成字节流数据!

现在就可以使用序列化功能,将数据序列化成为字节流的格式,然后存在文件当中,当需要的时候,再从文件中读取出来,然后反序列化成为数据原来的样子,而且保证原数据的数据结构没有变化。

而且可以序列化语言当中的任何数据类型,就是说不止是基本的数据类型,还有函数、类、对象……

dumps & loads

dumps将任意对象序列化成bytes数据,loads将序列化成为bytes的数据反序列成数据原本的格式。

注意:只能反序列化被序列化的数据

import pickle

# 这是我想要保存的一段数据
lst = ['A', 'B', 'C']

# dumps 把任意对象序列化成bytes
res = pickle.dumps(lst)
print(res)  # b'\x80\x03]q\x00(X\x01\x00\x00\x00Aq\x01X\x01\x00\x00\x00Bq\x02X\x01\x00\x00\x00Cq\x03e.'
print(type(res))  # <class 'bytes'>
# 序列化后的bytes数据可以写入文件中。

# loads 把任意bytes反序列化成为原来的数据
lst = pickle.loads(res)
print(lst)  # ['A', 'B', 'C']
print(type(lst))  # <class 'list'>

# 尝试反序列化其它的bytes数据
char = '你好'
by_char = char.encode()
new_char = pickle.loads(by_char)  # _pickle.UnpicklingError: invalid load key, '\xe4'.

dump & load

含义和上述的相同,只是这个可以直接操作IO对象,省时省力。

import pickle

# 这是我想要保存的一段数据
lst = ['A', 'B', 'C']

# dumps 和 loads 配合文件操作
# 序列化后写入文件
with open('test.txt', 'wb') as fp:
    data = pickle.dumps(lst)
    fp.write(data)
# 读取文件反序列化
with open('test.txt', 'rb') as fp:
    data = fp.read()
    lst = pickle.loads(data)

# dump 和 load 配合文件操作
# 序列化写入文件
with open('test.txt', 'wb') as fp:
    pickle.dump(lst, fp)
# 读取文件反序列化
with open('test.txt', 'rb') as fp:
    lst = pickle.load(fp)

JSON序列化模块

import json

使用场景

序列化后的数据,如果想在多种语言中都可以流通怎么办?每种语言都有自己的语言特性,有些语言中的数据是特有的,那么序列化后的数据该怎么流通呢?

每种语言虽然各有自己的特点,但是几乎所以的语言都是师出同门,天下语言无不出C者。所以将每种语言共同存在的数据格式按照统一的标准去序列化就可以了,JSON诞生了。

json一般存储为json文件。

支持的数据类型

python中支持JSON序列化的数据一共有八种类型:

int、float、bool、str、list、tuple、dict、None

JSON序列化支持这几种数据类型是因为JSON中就只支持这几种数据类型:

如下为python中的数据类型对应json中的数据类型;

python数据类型 JSON数据类型
int int
float float
bool(True,False) bool(true,false)
None null
str str(必须双引号)
list([])、tuple(()) Array([])
dict({}) Object({})(键必须是双引号)

注意:

  1. JSON中没有元组类型,所以会变成列表;
  2. JSON中的对象必须使用字符串作为键,所以python中的字典数据中的非字符串键,会变成对应的JSON数据然后强转成为字符串;
import json
dict_var = {1: 1, 2.2: 2.2, False: True, '123': '123', "234": "234", None: None}
json_obj = json.dumps(dict_var)
dict_var = json.loads(json_obj)
print(dict_var)
# {'1': 1, '2.2': 2.2, 'false': True, '123': '123', '234': '234', 'null': None}

JSON和pickle的区别

JSON可以序列化python八种数据,序列化为字符串。

pickle可以序列化python所有的数据类型,序列化为字节流。

序列化函数

JSON序列化函数和pickle的一样,名称和使用方法基本一样:

方法 含义
dumps 序列化
loads 反序列化
dump 序列化写入文件
load 读取文件反序列化

这里注意一下序列化方法的几个常用参数:

ensure_asscii 默认为True, 以ACSII格式编码,以Unicode显示;

sort_keys 默认为True, 对字典的键进行排序;

indent默认为None, json格式化默认是一行不加缩进的,如果indent是一个正整数,就以该缩进级别进行换行,增强可视化。

import json
# 开启排序
dict_var = {'B': '2', 'A': '1'}
print(dict_var)  # {'B': '2', 'A': '1'}
json_char = json.dumps(dict_var, ensure_ascii=False, sort_keys=True)
dict_var = json.loads(json_char)
print(dict_var)  # {'A': '1', 'B': '2'}
# 关闭排序
dict_var = {'B': '2', 'A': '1'}
print(dict_var)  # {'B': '2', 'A': '1'}
json_char = json.dumps(dict_var, ensure_ascii=False, sort_keys=False)
dict_var = json.loads(json_char)
print(dict_var)  # {'B': '2', 'A': '1'}
# dump 也一样哦

json和pickle实际使用过程中的一些问题

在对文件进行操作的时候:

  1. json可以连续dump,但是不能连续load
  2. pickle可以连续dump和load

如下解释:

# json 可以连续dump,但是不能连续load
import json
# 序列化数据
lst1 = [1, 2, 3]
lst2 = [4, 5, 6]
lst3 = [7, 8, 9]
# 序列化写入文件
with open('test.json', 'w', encoding='UTF-8') as fp:
    json.dump(lst1, fp)
    json.dump(lst2, fp)
    json.dump(lst3, fp)
# 读取文件反序列化
with open('test.json', 'r', encoding='UTF-8') as fp:
    data1 = json.load(fp)  # ERROR
    data2 = json.load(fp)
    data3 = json.load(fp)
# !!! json.decoder.JSONDecodeError: Extra data: line 1 column 10 (char 9)

因为 json.dump 方法序列化写入文件的时候,写入了两个及以上的数据,之后 json.load 方法在读的时候又是一次性将整个文件中的数据读取出来,这个时候,反序列化的数据成了 [1, 2, 3][4, 5, 6][7, 8, 9] ,这明显不是一个json支持的数据格式,所以 json.load 失败了。

再来看pickle是怎么样的:

# pickle 可以连续dump,也可以连续load
import pickle
# 序列化数据
lst1 = [1, 2, 3]
lst2 = [4, 5, 6]
lst3 = [7, 8, 9]
# 序列化写入文件
with open('pickle.txt', 'wb') as fp:
    pickle.dump(lst1, fp)
    pickle.dump(lst2, fp)
    pickle.dump(lst3, fp)
# 读取文件反序列化
with open('pickle.txt', 'rb') as fp:
    data1 = pickle.load(fp)  # [1, 2, 3]
    print(data1)
    data2 = pickle.load(fp)  # [4, 5, 6]
    print(data2)
    data3 = pickle.load(fp)  # [7, 8, 9]
    print(data3)
# 尝试先逐行读取,再反序列化
with open('pickle.txt', 'rb') as fp:
    datum = fp.readlines()
    print(len(datum))  # 1

    for data in datum:
        data = pickle.loads(data)
        print(data)  # [1, 2, 3]   # 只能读出一个

可以看到 pickle.load 将数据都读出来了,这是因为 pickle.dump 在写入数据的时候在每条数据后都加上了一个标记(有些人解释说是换行,但是文件中并没有换行,逐行使用 fp.readlines 逐行读取的时候也只能获取一条,但是在文件中所有的数据都是在同一行的,我也不太懂了(无奈)),然后 pickle.load 每次就只会读一条数据,从IO指针读到每条数据后的那个标记为止,所以,pickle 可以连续的 load

怎么解决json的这个问题?

其实上面的这个问题,我个人认为是一种不规范的操作。因为 json.load 会一次性的读取整个文件中的内容,你却在一个文件中写入了不止一条的数据,那么在反序列化的时候当然会报错了。所以我认为:

json的主要作用多语言之前的数据传递和数据存储,每个JSON文件中最好只储存一条完整的数据。

但是我就想在一个json文件中存多个数据呢?

其实思路很简单,关键就是读取文件然后反序列化的时候,必须是一条数据、一条数据的反序列化,类似如下:

import json
# 序列化数据
lst1 = [1, 2, 3]
lst2 = [4, 5, 6]
lst3 = [7, 8, 9]
# 序列化写入文件,每写入一条数据插一个换行
with open('test.json', 'w', encoding='UTF-8') as fp:
    json.dump(lst1, fp)
    fp.write('\n')
    json.dump(lst2, fp)
    fp.write('\n')
    json.dump(lst3, fp)
# 读取文件反序列化(逐行读取数据,然后反序列化)
with open('test.json', 'r', encoding='UTF-8') as fp:
    datum = fp.readlines()
    print(len(datum))  # 3
    for data in datum:
        data = json.loads(data)
        print(data)  # [1, 2, 3]
                     # [4, 5, 6]
                     # [7, 8, 9]

pickle和json的区别总结

  • json序列化后的数据为字符串,pickle序列化后的数据为字节流;
  • json支持八种数据类型(int、float、bool、str、list、tuple、dict、None),pickle支持python的一切数据类型;
  • json一般用于多语言间的数据交流,pickle一般用于python之间数据交流;

到此这篇关于Python常用标准库(pickle序列化和JSON序列化)的文章就介绍到这了,更多相关Python pickle序列化和JSON序列化内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 详解Python之数据序列化(json、pickle、shelve)

    一.前言 1. 现实需求 每种编程语言都有各自的数据类型,其中面向对象的编程语言还允许开发者自定义数据类型(如:自定义类),Python也是一样.很多时候我们会有这样的需求: 把内存中的各种数据类型的数据通过网络传送给其它机器或客户端: 把内存中的各种数据类型的数据保存到本地磁盘持久化: 2.数据格式 如果要将一个系统内的数据通过网络传输给其它系统或客户端,我们通常都需要先把这些数据转化为字符串或字节串,而且需要规定一种统一的数据格式才能让数据接收端正确解析并理解这些数据的含义.XML 是早期被

  • Python序列化模块之pickle与json详解

    目录 序列化模块 序列化和反序列化 使用场景 dumps & loads dump & load JSON序列化模块 使用场景 支持的数据类型 JSON和pickle的区别 序列化函数 json和pickle实际使用过程中的一些问题 pickle和json的区别总结 序列化模块 import pickle 序列化和反序列化 把不能直接存储的数据变得可存储,这个过程叫做序列化.把文件中的数据拿出来,回复称原来的数据类型,这个过程叫做反序列化. 在文件中存储的数据只能是字符串,或者是字节流,不

  • Python之数据序列化(json、pickle、shelve)详解

    什么是序列化 什么是序列化,把程序中的对象或者变量,从内存中转换为可存储或可传输的过程称为序列化.在 Python 中,这个过程称为 pickling,在其他语言中也被称为 serialization,marshalling,flattening 等.程序中的对象(或者变量)在序列化之后,就可以直接存放到存储设备上,或者直接发送到网络上进行传输. 序列化的逆向过程,即为反序列化(unpickling),就是把序列化的对象(或者变量)重新读到内存中~ Python中序列化的模块 模块名称 描述 提

  • Python3.5 Json与pickle实现数据序列化与反序列化操作示例

    本文实例讲述了Python3.5 Json与pickle实现数据序列化与反序列化操作.分享给大家供大家参考,具体如下: 1.Json:不同语言之间进行数据交互. (1)JSON数据序列化:dumps() JSON数据是一种轻量级的数据交换格式,序列化:将内存数据对象变成字符串. #!/usr/bin/env python # -*- coding:utf-8 -*- # Author:ZhengzhengLiu import json info = { "name":"liu

  • Python序列化基础知识(json/pickle)

    我们把对象(变量)从内存中变成可存储的过程称之为序列化,比如XML,在Python中叫pickling,在其他语言中也被称之为serialization,marshalling,flattening等等,都是一个意思. 序列化后,就可以把序列化后的内容写入磁盘,或者通过网络传输到其他服务器上,反过来,把变量内容从序列化的对象重新读到内存里称之为反序列化,即unpickling json(JavaScript Object Notation) 一种轻量级的数据交换格式.它基于ECMAScript的

  • Python 对象序列化与反序列化之pickle json详细解析

    目录 引言 pickle json 尾语 引言 将对象的状态信息转换为可以存储或传输的形式的过程叫作序列化 类似地从序列化后的数据转换成相对应的对象叫作 反序列化 本文介绍 Python 将对象序列化和反序化的两个模块 picklejson pickle pickle # 序列化 In [19]: num = 66 In [20]: s = 'python' In [21]: pi = 3.14 In [22]: li = [1, 2, 3] In [27]: b_num = pickle.du

  • Python标准库之typing的用法(类型标注)

    PEP 3107引入了功能注释的语法,PEP 484 加入了类型检查 标准库 typing 为类型提示指定的运行时提供支持. 示例: def f(a: str, b:int) -> str: return a * b 如果实参不是预期的类型: 但是,Python运行时不强制执行函数和变量类型注释.使用类型检查器,IDE,lint等才能帮助代码进行强制类型检查. 使用NewType 创建类型 NewType() 是一个辅助函数,用于向类型检查器指示不同的类型,在运行时,它返回一个函数,该函数返回其

  • Python常用标准库详解(pickle序列化和JSON序列化)

    目录 常用的标准库 序列化模块 序列化和反序列化 使用场景 dumps & loads dump & load JSON序列化模块 使用场景 支持的数据类型 JSON和pickle的区别 序列化函数 json和pickle实际使用过程中的一些问题 pickle和json的区别总结 常用的标准库 序列化模块 import pickle 序列化和反序列化 把不能直接存储的数据变得可存储,这个过程叫做序列化.把文件中的数据拿出来,回复称原来的数据类型,这个过程叫做反序列化. 在文件中存储的数据只

  • 详解Python常用标准库之时间模块time和datetime

    目录 time时间模块 time -- 获取本地时间戳 localtime -- 获取本地时间元组(UTC) gmtime -- 获取时间元组(GMT) mktime -- 时间元组获取时间戳 ctime -- 获取时间字符串 asctime -- 时间元组获取时间字符串 strftime -- 格式化时间 strptime -- 格式化时间 sleep -- 时间睡眠 perf_counter -- 时间计时 模拟进度条 程序计时 时间转换示意图 datetime时间模块 date类 time

  • 详解Python常用标准库之os模块与shutil模块

    目录 系统模块 常用方法 常用属性 文件操作 路径模块 文件复制移动模块(文件操作) copyfileobj -- 复制文件(内容) copyfile -- 复制文件(内容) copymode -- 复制文件(权限) copystat -- 复制文件(除了内容) copy & copy2 -- 复制文件 copytree -- 迭代复制文件夹中的所有 rmtree -- 迭代删除文件夹(即使文件夹中有文件) move -- 移动文件或文件夹 系统模块 import os 系统模块用于对系统进行操

  • Python 常用string函数详解

    字符串中字符大小写的变换 1. str.lower()   //小写 >>> 'SkatE'.lower() 'skate' 2. str.upper()   //大写 >>> 'SkatE'.upper() 'SKATE' 3. str.swapcase()  //大小写互换 >>> 'SkatE'.swapcase() 'sKATe' 4. str.title()   //首字母大写,其余的小写 >>> 'SkatE'.title

  • python常用数据结构元组详解

    目录 Tuple 元组 元组的定义和使用 元组常用方法 index(item) count(item):返回某个元素出现的次数 元组解包 元组与列表 Tuple 元组 元组的定义和使用 元组的定义: 元组是有序的不可变对象集合 元组使用小括号包围,各个对象之间使用逗号分隔 元组是异构的,可以包含多种数据类型 元组使用:创建 创建: --使用逗号分隔 --通过小括号填充元素 --通过构造方法tuple(iterable)-----iterable:可迭代对象 --注意:单元素元组,逗号不可或缺 #

  • python常用数据结构集合详解

    目录 set集合 集合定义与使用 集合常用方法 add() update() remove() discard() pop() clear() 集合运算 交集运算 并集运算 差集运算 集合推导式 set集合 集合定义与使用 集合定义: --无序的唯一对象集合 --用大括号{}包围,对象相互之间使用逗号分隔 --集合是动态的,可以随时添加或删除元素 --集合是异构的,可以包含不同类型的数据 集合使用:创建 创建: --通过使用{}填充元素 --通过构造方法set() --通过集合推导式 # 集合使

  • Python常用标准库之os模块功能

    目录 系统相关 文件和目录操作 执行命令 模块导入方式: import os os模块是Python标准库中的一个用于访问操作系统相关功能的模块,os模块提供了一种可移植的使用操作系统功能的方法.使用os模块中提供的接口,可以实现跨平台访问.但是,并不是所有的os模块中的接口在全平台都通用,有些接口的实现是依赖特定平台的,比如linux相关的文件权限管理和进程管理. os模块的主要功能:系统相关.目录及文件操作.执行命令和管理进程 Ps:其中的进程管理功能主要是Linux相关的,此处不做讨论.

  • python状态机transitions库详解

    一.简介  transitions库 pip install transitions 状态机 state:状态节点 transition:用于从一个状态节点移动到另一个状态节点 教程 https://pypi.org/project/transitions/ 二.逐步创建 创建对象 创建一个继承object的类Number的实体对象number,然后调用transitions.Machine()将状态机绑定到这个实体对象上. from transitions import Machine cla

  • python time时间库详解

    Python中内置了一些与时间处理相关的库,如time.datatime和calendar库. 其中time库是Python中处理时间的标准库,是最基础的时间处理库. 使用库 :import time安装:系统自带示例: 时间搓time.time() import time ticks = time.time() print ("当前时间戳为:", ticks) 本地时间读取time.localtime() localtime = time.localtime() print (&qu

  • js移动端事件基础及常用事件库详解

    一.事件基础 PC:click.mouseover.mouseout.mouseenter.mouseleave.mousemove.mousedown.mouseup.mousewheel.keydown.keyup.load.scroll.blur.focus.change... 移动端:click(单击).load.scroll.blur.focus.change.input(代替keyup.keydown)...TOUCH事件模型(处理单手指操作).GESTURE事件模型(处理多手指操作

随机推荐