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

yipeiwu_com4年前Python基础

什么是序列化

什么是序列化,把程序中的对象或者变量,从内存中转换为可存储或可传输的过程称为序列化。在 Python 中,这个过程称为 pickling,在其他语言中也被称为 serialization,marshalling,flattening 等。程序中的对象(或者变量)在序列化之后,就可以直接存放到存储设备上,或者直接发送到网络上进行传输。

序列化的逆向过程,即为反序列化(unpickling),就是把序列化的对象(或者变量)重新读到内存中~

Python中序列化的模块

模块名称 描述 提供的api
json 用于实现Python数据类型与通用(json)字符串之间的转换 dumps()、dump()、loads()、load()
pickle 用于实现Python数据类型与Python特定二进制格式之间的转换 dumps()、dump()、loads()、load()
shelve 专门用于将Python数据类型的数据持久化到磁盘,shelve是一个类似dict的对象,操作十分便捷 open()

json模块

大部分编程语言都会提供处理json数据的接口,Python 2.6开始加入了json模块,且把它作为一个内置模块提供,无需下载即可使用。

json支持的数据格式有限,有int str list dict以及特殊的tuple(会将tuple转为list)

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

dumps和loads主要是在内存内操作,如下:

import json 
 list = ['a','b','c'] 
 list_str = json.dumps(list)
 print(list_str)   #["a", "b", "c"] 
 list2 = json.loads(list_str)
 print(list2)    #['a', 'b', 'c']

而dump和load是从文件内操作,如下:

import json
 list = ['a','b','c']
 with open('test','w',encoding='utf-8') as f:
   json.dump(list,f) 
 with open('test','r',encoding='utf-8') as f2:
   json.load(f2)

json模块中的字符编码问题

在Python3中,代码中的字符串都是使用 unicode 格式存放的,序列化之后也是以unicode 格式存放,所以序列化和反序列化过程都不存在问题。

Python2中,代码中的字符串是 str类型,str类型 和 unicode类型 的关系如下所示:

unicode -----> encode --------> str(例如为 utf-8编码)

utf-8(例如为 utf-8编码) --------> decode ----------> unicode

所以在Python2中,序列化过程和反序列化过程都有涉及到转码过程(encode和decode),序列化过程 会先将对象中的字符串 使用utf-8 进行解码(decode),转换为unicode类型后,再存放到文件或者字符串中,反序列化过程 会将 json字符串 使用utf-8 编码(encode),然后存放到内存中的变量~

pickle模块

用法与json类似,不过pickle不能跨语言,优点是它支持python所有的数据类型

需要注意的是,pickle是以bytes类型来进行序列化的

import pickle
 list = ['a','b','c']
 list_str = pickle.dumps(list)
 print(list_str)     #b'\x80\x03]q\x00(X\x01\x00\x00\x00aq\x01X\x01\x00\x00\x00bq\x02X\x01\x00\x00\x00cq\x03e.'
 
 list2 = pickle.loads(list_str)
 print(list2)      #['a', 'b', 'c']

而正因为pickle是以bytes类型进行序列化的,所以在用dump和load方法对文件进行写入或者反序列化的时候,要以wb或者rb模式打开,如下:

import pickle
 list = ['a','b','c']
 with open('test','wb') as f:
   pickle.dump(list,f) 
 with open('test','rb') as f2:
   pickle.load(f2)

shelve模块

shelve也是python提供给我们的序列化工具,比pickle用起来更简单一些。 shelve只提供给我们一个open方法,是用key来访问的,使用起来和字典类似。

import shelve
 f = shelve.open('test1')
 f['key'] = {'a':1, 'b':2, 'c':'sss'} #直接对文件句柄操作,就可以存入数据
 f['key2'] = {'d':3, 'e':4, 'f':'ddd'}
 f.close()
 f1 = shelve.open('test1')
 dic1 = f1['key'] #取出数据的时候也只需要直接用key获取即可,但是如果key不存在会报错
 dic2 = f1['key2']
 f1.close()
 print(dic1)
 print(dic2)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持【听图阁-专注于Python设计】。

相关文章

详解Python中的__new__()方法的使用

先看下object类中对__new__()方法的定义: class object: @staticmethod # known case of __new__...

Windows和Linux下使用Python访问SqlServer的方法介绍

经常用Python写demo来验证方案的可行性,最近遇到了Python访问SqlServer的问题,这里总结下。 一、Windows下配置Python访问Sqlserver 环境:Win...

Python脚本实现虾米网签到功能

Python脚本实现虾米网签到功能

本文实例讲述了Python脚本实现虾米网签到功能的方法。分享给大家供大家参考,具体如下: 概述 这个脚本完成了自动登录虾米网、签到的功能。 大致要用到urllib、urllib2、coo...

python复制与引用用法分析

本文实例讲述了python复制与引用用法。分享给大家供大家参考。具体分析如下: 简单复制是引用 a=[1,23,4] b=a #这是引用 b.append(2323) print(a...

python之文件的读写和文件目录以及文件夹的操作实现代码

为了安全起见,最好还是给打开的文件对象指定一个名字,这样在完成操作之后可以迅速关闭文件,防止一些无用的文件对象占用内存。举个例子,对文本文件读取: file_object = ope...