json模块和pickle模块的用法

原创 2018年04月15日 17:17:47

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中:

i

mport 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'>

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

二:总结

     1. json序列化方法:

      dumps:无文件操作            dump:序列化+写入文件
  1. json反序列化方法:

      loads:无文件操作              load: 读文件+反序列化
    
  2. json模块序列化的数据 更通用

    picle模块序列化的数据 仅python可用,但功能强大,可以序列号函数

  3. json模块可以序列化和反序列化的 数据类型 见 python对象(obj) 与json对象的对应关系表

  4. 格式化写入文件利用 indent = 4

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_41187256/article/details/79950970

Python中pickle模块的使用

import pickle >>> my_list=[666,5.21,['haha']] >>> pickle_file=open('my_list.pickle','wb') >>> pickle...
  • sinat_37390744
  • sinat_37390744
  • 2017-02-15 16:09:08
  • 286

Python中的json与pickle模块

一、基础json和pickle模块是将数据进行序列化处理,并进行网络传输或存入硬盘。import json import pickle pickle模块 python的pickle模块实现了pyt...
  • shuyededenghou
  • shuyededenghou
  • 2017-07-23 16:29:26
  • 310

python struct、json、pickle模块

(1)json模块 json模块的dumps和dump方法可以将python字典转为符合json数据格式要求的字符串数据,而loads() load()方法可以将json字符串数据转为python字...
  • u010872995
  • u010872995
  • 2016-03-02 20:58:03
  • 1087

python pickle模块 json模块

python 在在程序运行过程中,所有的变量都是在内存中,内存中的变量可以通过命令操作随意改变,一旦程序结束,变量所占用的内存会被系统全部收回,如果没有把修改的变量存储到磁盘上,下次运行时,变量又被初...
  • qq_36247422
  • qq_36247422
  • 2016-10-12 21:55:37
  • 146

Python数据存储:pickle模块的使用讲解

在机器学习中,我们常常需要把训练好的模型存储起来,这样在进行决策时直接将模型读出,而不需要重新训练模型,这样就大大节约了时间。Python提供的pickle模块就很好地解决了这个问题,它可以序列化对象...
  • coffee_cream
  • coffee_cream
  • 2016-06-24 17:11:04
  • 8783

Python-json与pickle数据序列化

什么是序列化?把变量从内存中变成可存储或可传输的过程就称之为序列化。在Python中称为picking,在其他语言中称之为serialization,marshalling,flattening等等,...
  • y472360651
  • y472360651
  • 2017-06-12 20:24:39
  • 363

Python pickle模块和joblib模块浅析

在Python中,如果希望透明地存储对象,而不丢失其身份和类型等信息,则需要某种形式的对象序列化,这是一个将任意复杂的对象转成对象的文本和二进制表示的过程。同样,必须能够将对象经过序列化后的形式恢复到...
  • red_stone1
  • red_stone1
  • 2017-05-03 23:04:10
  • 3245

python3.X中pickle类的用法(cPickle模块移除了)

python3.X中pickle和Cpickle、python3.X版本下pickle类用法 1、python3.x中移除了cPickle模块,可以使用pickle模块代替。最终我们将会...
  • lanqiu5ge
  • lanqiu5ge
  • 2014-05-06 16:00:02
  • 7672

Python pickle模块学习(超级详细)

Python pickle模块学习
  • sxingming
  • sxingming
  • 2016-08-10 12:03:05
  • 24618

Python的pickle模块详解

Python的pickle模块实现了Python对象与字节流之间的二进制转换协议。即Python的pickle模块提供了Python对象的序列化/反序列化功能。 Pickling,即序列化,...
  • taiyangdao
  • taiyangdao
  • 2017-11-01 20:47:00
  • 207
收藏助手
不良信息举报
您举报文章:json模块和pickle模块的用法
举报原因:
原因补充:

(最多只允许输入30个字)