首页 > python学习 > python中的json、pickle和shelve模块
2021
07-29

python中的json、pickle和shelve模块

json模块

json.dump(obj, file_obj, *, skipkeys=False, ensure_ascii=True, indent=None, separators=None, default=None, sort_keys=False)

序列化obj为一个JSON格式的流并输出到file_obj(支持write()的文件或类文件对象)。
如果skipkeys是true,那么那些不是基本对象(包括 str, int、float、bool、None)的字典的键会被跳过而不引发TypeError。
json 模块始终产生 str 对象而非 bytes 对象。因此,fp.write() 必须支持 str 输入。
如果ensure_ascii是true ,将所有输入的非ASCII字符转义。否则这些字符会原样输出。
如果indent是一个非负整数或者字符串,那么JSON数组元素和对象成员会被美化输出为该值指定的缩进等级。如果缩进等级为零、负数或者 "",则只会添加换行符。None(默认值)选择最紧凑的表达。使用一个正整数会让每一层缩进同样数量的空格。如果 *indent* 是一个字符串(比如 "\t"),那个字符串会被用于缩进每一层。
当指定时,separators 应当是一个 (item_separator, key_separator) 元组。当indent为 None 时,默认值取 (', ', ': '),否则取 (',', ': ')。为了得到最紧凑的 JSON 表达式,你应该指定其为 (',', ':') 以消除空白字符。
当 default 被指定时,其应该是一个函数,每当某个对象无法被序列化时它会被调用。它应该返回该对象的一个可以被 JSON 编码的版本或者引发一个 TypeError。如果没有被指定,则会直接引发 TypeError。
如果 sort_keys 是 true(默认为 False),那么字典的输出会以键的名称排序

json.dumps(obj, *, skipkeys=False, ensure_ascii=True, indent=None, separators=None, default=None, sort_keys=False)

序列化obj为一个JSON格式str并返回该字符串,而不是将其写入文件。

json.load(file_obj, *, object_hook=None, parse_float=None, parse_int=None, object_pairs_hook=None)

将file_obj(支持read()并包含一个JSON文档的文件或类文件对象)反序列化为一个Python对象
object_hook:可选函数,它会被调用于每一个解码出的对象字面量(一个dict)。object_hook的返回值会取代原本的dict。被用于实现自定义解码器。
object_pairs_hook:可选函数,它将使用按顺序排列的对列表解码的任何对象文本的结果来调用。将使用对象对挂钩的返回值而不是dict。可用于实现自定义解码器。object_pairs_hook优先级高于object_hook。
parse_float:如果指定,将使用要解码的每个JSON浮点的字符串调用。默认情况下,这相当于float(num_str)。这可以用于为JSON浮点使用另一个数据类型或解析器
parse_int:如果指定,将使用要解码的每个JSON int的字符串调用。默认情况下,这相当于int(num_str)。这可用于为JSON整数使用另一个数据类型或解析器

json.loads(json_str, *, object_hook=None, parse_float=None, parse_int=None, object_pairs_hook=None)

将json_str反序列化为python对象。如果json_str不是有效的JSON文档,则会引发JSONDECODECORE错误

pickle模块

在实际使用中我们会碰到需要把一些复杂的对象永久保存(保存成文件),这时候如果使用传统方法保存成文本,需要把对象先转换为字符串,有些对象在转换成字符串的时候可能会出现不可预料的错误,pickle模块就是解决这个问题,把对象保存为二进制文件,如果有一个比较复杂的object对象需要保存

pickle.dump(obj, file, protocol=None):将obj的pickled表示写入打开的文件对象文件。
protocol是一个整数,它告诉pickler使用给定的协议版本;支持的协议是0到pickle.HIGHEST_PROTOCOL(这个常量表示可用的最高协议版本)。默认为pickle.DEFAULT_PROTOCOL(这个常量表示默认协议版本,可能小于最高协议,目前默认的协议是3,这是为python 3设计的新协议)。如果指定负数,则选择最高的协议。

pickle.dumps(obj, protocol=None):将obj的pickled表示返回为bytes对象,而不是将其写入文件。

pickle.load(file):从打开的文件对象文件中读取pickled数据,并返回其转换之后的原数据对象结构。会自动检测pickle的协议版本,因此不需要协议参数。

pickle.loads(bytes_object)把bytes类型的pickled对象转换为其原有的数据对象结构

import pickle
#写入并保存文件
pickle_file = open('D:\\save_file.packle','wb')#保存文件的后缀可以随意写,后面的模式要写上b,以二进制模式打开
pickle.dump(object,pickle_file)#使用pickle模块的dump()方法保存文件
pickle_file.close()
#读取并转换为原有数据格式
pickle_file = open('D:\\save_file.packle','rb')
object=pickle.load(pickle_file)

shelve模块

shelve是一个简单的将内存数据通过文件持久化保存的模块,类似key-value数据库,内部通过pickle协议来实现数据序列化。

key只能是字符串,value可以是所有python支持的数据类型

shelve.open(filename, flag='c', protocol=None, writeback=False)

打开一个持久化字典,并返回一个Shelf对象,Shelf对象支持字典所支持的大多数方法和运算(除了拷贝、构造器以及 | 和 |= 运算符)

filename指定持久化本地文件名(会自动为filename添加扩展名)。

flag表示打开数据存储文件的方式,默认'c'
    'r':以只读模式打开一个已经存在的数据存储文件
    'w':以读写模式打开一个已经存在的数据存储文件
    'c':以读写模式打开一个数据存储文件,如果不存在则创建
    'n':总是创建一个新的、空数据存储文件,并以读写模式打开

protocol用来指定pickle协议版本,默认适用第3版pickle协议来序列化值

writeback表示是否把持久化的数据全部保存至内存中,便于保存

Shelf对象无法确定持久化字典数据在何时被修改。
默认情况下只有在被修改对象再赋值给shelf对象时才会写入。
如果writeback形参设为True,则所有被访问的条目都将在内存中被缓存,并会在sync()和close()时被写入;
这可以使得对持久化字典中可变条目的修改更方便,但这会消耗大量内存作为缓存,并使得关闭操作变得非常缓慢

Shelf对象的方法:

Shelf.sync():如果Shelf打开时将writeback设为True则清空缓存并将持久化字典同步到磁盘,此方法会在使用 close()关闭Shelf时自动被调用

Shelf.close():同步并关闭持久化dict对象。对已关闭Shelf的操作将引发ValueError

最后编辑:
作者:qingheluo
这个作者貌似有点懒,什么都没有留下。

留下一个回复

你的email不会被公开。