Python之json模块和pickle模块详解

发布时间:2023年12月20日

json模块和pickle模块的用法

在python中,可以使用pickle和json两个模块对数据进行序列化操作。

其中:

json可以用于字符串或者字典等与python数据类型之间的序列化与反序列化操作。

pickle可以用于python特有类型与python数据类型之间的序列化与反序列化操作。

json模块的用法

1. 查看json模块内的方法:

>>>?import?json
>>>?dir(json)
['JSONDecodeError',?'JSONDecoder',?'JSONEncoder',?'__all__',?'__author__',?'__builtins__',?'__cached__',?'__doc__',?
'__file__',?'__loader__',?'__name__',?'__package__',?'__path__',?'__spec__',?'__version__',?'_default_decoder',?
'_default_encoder',?'decoder',?'dump',?'dumps',?'encoder',?'load',?'loads',?'scanner']

2. json模块常用的功能的:dumps,dump,loads,load

3.使用json.dumps方法可以将字典等数据格式化成一个字符串,这样可以方便别的编程语言进行调用。

>>>?dic1={"k1":"v1","k2":"v2"}
>>>?res=json.dumps(dic1)
>>>?print(res)
{"k1":?"v1",?"k2":?"v2"}
>>>?print(type(res))
<class?'str'>

格式化后的字符串看似跟原来的没什么两样,但是查看格式化后的类型就会发现是一个字符串,已经被json模块处理过了。

4.可以使用json.loads进行反序列化

>>>?print(type(res2))
<class?'dict'>
>>>?print(res)
{"k1":?"v1",?"k2":?"v2"}
>>>?print(type(res))
<class?'str'>
>>>?res2=json.loads(res)
>>>?print(res2)
{'k1':?'v1',?'k2':?'v2'}

5.还可以用json.dump方法把字典等数据类型序列化进入一个文件中,等待别的程序进行调用。

import?json
dic1={"k1":"v1","k2":"v2"}
with?open("f1","w")?as?f:
????json.dump(dic1,f)

运行上面的代码,可以看到在同级目录下,生成一个名为“f1”的文件,打开f1文件,其内容为:

{"k1":?"v1",?"k2":?"v2"}

6.可以使用json.load方法读取文件f1中的内容:

import?json
with?open("f1")?as?f:
????res=json.load(f)
????print(res)
????print(type(res))

打印反序列化后的数据及其类型,得到的结果为:

{'k1':?'v1',?'k2':?'v2'}
<class?'dict'>

pickle模块的用法

1.查看pickle模块内的方法:

>>>?import?pickle
>>>?dir(pickle)
['ADDITEMS',?'APPEND',?'APPENDS',?'BINBYTES',?'BINBYTES8',?'BINFLOAT',?'BINGET',?'BININT',?'BININT1',?'BININT2',
?'BINPERSID',?'BINPUT',?'BINSTRING',?'BINUNICODE',?'BINUNICODE8',?'BUILD',?'DEFAULT_PROTOCOL',?'DICT',?'DUP',?
?'EMPTY_DICT',?'EMPTY_LIST',?'EMPTY_SET',?'EMPTY_TUPLE',?'EXT1',?'EXT2',?'EXT4',?'FALSE',?'FLOAT',?'FRAME',?
?'FROZENSET',?'FunctionType',?'GET',?'GLOBAL',?'HIGHEST_PROTOCOL',?'INST',?'INT',?'LIST',?'LONG',?'LONG1',?'LONG4',
?'LONG_BINGET',?'LONG_BINPUT',?'MARK',?'MEMOIZE',?'NEWFALSE',?'NEWOBJ',?'NEWOBJ_EX',?'NEWTRUE',?'NONE',?'OBJ',?
?'PERSID',?'POP',?'POP_MARK',?'PROTO',?'PUT',?'PickleError',?'Pickler',?'PicklingError',?'PyStringMap',?'REDUCE',?
?'SETITEM',?'SETITEMS',?'SHORT_BINBYTES',?'SHORT_BINSTRING',?'SHORT_BINUNICODE',?'STACK_GLOBAL',?'STOP',?'STRING',?
?'TRUE',?'TUPLE',?'TUPLE1',?'TUPLE2',?'TUPLE3',?'UNICODE',?'Unpickler',?'UnpicklingError',?'_Framer',?'_Pickler',?
?'_Stop',?'_Unframer',?'_Unpickler',?'__all__',?'__builtins__',?'__cached__',?'__doc__',?'__file__',?'__loader__',?
?'__name__',?'__package__',?'__spec__',?'_compat_pickle',?'_dump',?'_dumps',?'_extension_cache',?'_extension_registry',
?'_getattribute',?'_inverted_registry',?'_load',?'_loads',?'_test',?'_tuplesize2code',?'bytes_types',?'codecs',
?'compatible_formats',?'decode_long',?'dispatch_table',?'dump',?'dumps',?'encode_long',?'format_version',?'io',?
?'islice',?'load',?'loads',?'maxsize',?'pack',?'re',?'sys',?'unpack',?'whichmodule']

2.想查看某一个方法的帮助文档:

help(pickle.modules)

比如,我想知道pickle下的dump模块怎么用:

help(pickle.dump)

就可以得到pickle.dump方法的帮助文档

3.pickle模块常用的方法有:dumps,loads,dump,load

4.使用pickle.dumps对数据进行序列化操作

import?pickle
l1=[1,2,3,4,5]
t1=(1,2,3,4,5)
dic1={"k1":"v1","k2":"v2","k3":"v3"}
res_l1=pickle.dumps(l1)
res_t1=pickle.dumps(t1)
res_dic=pickle.dumps(dic1)
print(res_l1)
print(res_t1)
print(res_dic)

对数据进行序列化操作后,打印数据得到结果为:

b'\x80\x03]q\x00(K\x01K\x02K\x03K\x04K\x05e.'
b'\x80\x03(K\x01K\x02K\x03K\x04K\x05tq\x00.'
b'\x80\x03}q\x00(X\x02\x00\x00\x00k1q\x01X\x02\x00\x00\x00v1q\x02X\x02\x00\x00\x00k2q\x03X\x02\x00
\x00\x00v2q\x04X\x02\x00\x00\x00k3q\x05X\x02\x00\x00\x00v3q\x06u.'

可以看到是一堆二进制乱码

5.使用pickle.loads进行反序列化操作

import?pickle
l1=[1,2,3,4,5]
t1=(1,2,3,4,5)
dic1={"k1":"v1","k2":"v2","k3":"v3"}
res_l1=pickle.dumps(l1)
res_t1=pickle.dumps(t1)
res_dic=pickle.dumps(dic1)
print(pickle.loads(res_l1),type(pickle.loads(res_l1)))
print(pickle.loads(res_t1),type(pickle.loads(res_t1)))
print(pickle.loads(res_dic),type(pickle.loads(res_dic)))

打印序列化后的数据及其类型,得到结果为:

[1,?2,?3,?4,?5]?<class?'list'>
(1,?2,?3,?4,?5)?<class?'tuple'>
{'k1':?'v1',?'k2':?'v2',?'k3':?'v3'}?<class?'dict'>

可以看到序列化之前是什么类型的数据,反序列化后其数据类型不变。

6.可以用pickle.dumps把列表,元组或字典序列化进一个文件中以实现永久保存。

把列表l1序列化进一个文件f1中:

import?pickle
l1=[1,2,3,4,5]
t1=(1,2,3,4,5)
dic1={"k1":"v1","k2":"v2","k3":"v3"}
with?open("f1","wb")?as?f:
????pickle.dump(l1,f)

7.可以使用pickle.load对文件f1进行反序列化,得到文件f1里保存的数据

import?pickle
with?open("f1","rb")?as?f:
????res=pickle.load(f)
????print(res)

反序列化之后,打印数据及其类型可以看到:

[1,?2,?3,?4,?5]
<class?'list'>

使用同样的方法,也可以把元组,或字典序列化进一个文件中以实现永久保存。

文章来源:https://blog.csdn.net/hakesashou/article/details/135116168
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。