pickle和json模块是Python内置模块,不需要额外安装可以直接使用,pickle模块序列化对象是以二进制的形式序列化后保存到文件中(保存文件的后缀为 .pkl),由于不是文本格式,所以不能直接打开查看。json模块是序列化成json字符串,若要保存文件中,则是以文本格式保存,可以直接查看。本文主要介绍Python pickle和json模块配置及使用。

1、序列化和反序列化

序列化 (Serialization)是将对象的信息转换为可以存储或传输的形式的过程,如数据对象转成文本。反序列化是将序列化后的文本内容在还原成对象。也就是序列化后的格式的内容解析成对象的过程。一般比较常用的是json模块,可以将数据对象序列化成json格式字符串,然后在网络传输或持久化保存。需要使用时,在将传输后的字符串或持久化保存的字符串,反序化成对象。

2、pickle的序列化和反序列化方法(dump()、dumps()、load()和loads())

pickle模块的序列化的方法为pickle.dump()pickle.dumps(),反序列化方法为pickle.load()pickle.loads()

参考文档https://docs.python.org/3/library/pickle.html

1)dump()方法

pickle.dump(obj, file, protocol=None,*,fix_imports=True)

实现的是将序列化后的对象obj以二进制形式写入文件file中,进行保存。

2)dumps()方法

pickle.dumps(obj, protocol=None,*,fix_imports=True)

pickle.dumps()方法跟 pickle.dump()方法的区别在于,pickle.dumps()方法不需要写入文件中,它是直接返回一个序列化的bytes对象。

3)load()方法

pickle.load(file, *,fix_imports=True, encoding="ASCII". errors="strict")

实现的是从文件中读取反序列化后的二进制形式字符串反序化成对象。pickle.dump()对应的就是pickle.load()方法。

4)loads()方法

pickle.loads(bytesobject, *,fiximports=True, encoding="ASCII". errors="strict")

pickle.loads()方法跟 pickle.load()方法的区别在于,pickle.loads()方法是直接从bytes对象中读取序列化的信息,而非从文件中读取。

5)使用示例

import pickle

data=['C', 'Java', 'Python']

#pickle.dump()和pickle.load()

# 打开一个文件,在那里你要存储数据
file1 = open('cjavapy.db', 'wb')

# 将信息转储到该文件中
pickle.dump(data, file1)

# 关闭文件
file1.close()

# 打开一个存储pickle数据的文件
file2 = open('cjavapy.db', 'rb')

# 从文件加载存储的数据
data = pickle.load(file2)

# 关闭文件
file2.close()

for item in data:
    print('item = ', item)
    
#pickle.dumps()和pickle.loads()
    
#序列化    
result = pickle.dumps(data)
print(result)

#反序化
print(pickle.loads(result),type(pickle.loads(result)))

3、json的序列化和反序列化方法(dump()、dumps()、load()和loads())

json模块的序列化的方法为json.dump()json.dumps(),反序列化方法为json.load()json.loads()

参考文档:https://docs.python.org/3/library/json.html

1)dump()方法

json.dump(file, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, encoding="utf-8", default=None, sort_keys=False, **kw)

实现的是将序列化后的对象obj以jjson格式字符串写入文件file中,进行保存。

2)dumps()方法

json.dumps(obj, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, encoding="utf-8", default=None, sort_keys=False, **kw)

json.dumps()方法跟 pickle.dump()方法的区别在于,json.dumps()方法不需要写入文件中,它是直接返回一个序列化的json字符串对象。

3)load()方法

json.load(file [, encoding[, cls[, object_hook[, parse_float[, parse_int[, parse_constant[, object_pairs_hook[, **kw]]]]]]]])

实现的是从文件中读取反序列化后的json字符串反序化成对象。json.dump()对应的就是json.load()方法。

4)loads()方法

json.loads(s[, encoding[, cls[, object_hook[, parse_float[, parse_int[, parse_constant[, object_pairs_hook[, **kw]]]]]]]])

json.loads()方法跟 json.load()方法的区别在于,json.loads()方法是直接从json格式字符串中读取序列化的信息,而非从文件中读取。

5)使用示例

import json

data=['C', 'Java', 'Python']

#json.dump()和json.load()

# 打开一个文件,在那里你要存储数据
file1 = open('cjavapy.db', 'wt')

# 将信息转储到该文件中
json.dump(data, file1)

# 关闭文件
file1.close()

# 打开一个存储json数据的文件
file2 = open('cjavapy.db', 'rb')

# 从文件加载存储的数据
data = json.load(file2)

# 关闭文件
file2.close()

for item in data:
    print('item = ', item)
    
#json.dumps()和json.loads()
    
#序列化    
result = json.dumps(data)
print(result)

#反序化
print(json.loads(result),type(json.loads(result)))

推荐文档