Python json中load和loads区别
摘抄笔记
这篇文章主要介绍了关于 Python json中load和loads区别,文章也有简单的说明它们之间的相同点,然后详细介绍不同点,需要的朋友可以参考一下文章的具体内容
一、相同点
dump
和dumps
都实现了序列化load
和loads
都实现反序列化
变量从内存中变成可存储或传输的过程称之为序列化序列化是将对象状态转化为可保存或可传输格式的过程。
变量内容从序列化的对象重新读到内存里称之为反序列化反序列化是流转换为对象。
二、区别
1.load 和 loads (反序列化)
load:针对文件句柄,将json
格式的字符转换为dict
,从文件中读取 (将string
转换为dict
)
1
|
a_json = json.load( open ( 'demo.json' , 'r' )) |
loads:针对内存对象,将string
转换为dict
(将string转换为dict)
1
|
a = json.loads( '{' a ':' 1111 ',' b ':' 2222 '}' ) |
2.dump 和 dumps(序列化)
dump:将dict类型转换为json
字符串格式,写入到文件 (易存储)
1
2
|
a_dict = { 'a' : '1111' , 'b' : '2222' } json.dump(a_dict, open ( 'demo.json' , 'w' ) |
dumps:将dict转换为string
(易传输)
1
2
|
a_dict = { 'a' : '1111' , 'b' : '2222' } a_str = json.dumps(a_dict) |
总结:
根据序列化和反序列的特性
- loads: 是将
string
转换为dict
- dumps: 是将
dict
转换为string
- load: 是将里
json
格式字符串转化为dict
,读取文件 - dump: 是将
dict
类型转换为json
格式字符串,存入文件
三、JSON进阶
1.序列化
1
2
3
4
5
6
7
8
9
|
# 使用class对象的__dict__方法 class Student( object ): def __init__( self , name, age, score): self .name = name self .age = age self .score = score import json s = Student( 'Bob' , 20 , 88 ) print (json.dumps(s, default = lambda obj: obj.__dict__)) |
2.反序列化
1
2
3
4
5
6
7
|
#Python学习交流群:531509025 def dict2student(d): return Student(d[ 'name' ], d[ 'age' ], d[ 'score' ]) json_str = '{"age": 20, "score": 88, "name": "Bob"}' print (json.loads(json_str, object_hook = dict2student)) |
四、python中的序列化和反序列化
Python
提供两个模块来实现序列化:cPickle
和pickle
。这两个模块功能是一样的,区别在于cPickle
是C语言写的,速度快,pickle
是纯Python
写的,速度慢。
- 变量从内存中变成可存储或传输的过程称之为序列化,在
Python
中叫pickling
- 变量内容从序列化的对象重新读到内存里称之为反序列化,即
unpickling
1
2
3
4
|
try : import cPickle as pickle except ImportError: import pickle |
1.将内存对象存取到磁盘
1
2
3
4
5
|
a = dict (a = 1 , b = 2 , c = 3 ) pickle.dumps(a) # 将对象序列化为str然后存入文件 a = dict (a = 1 , b = 2 , c = 3 ) pickle.dump(a, open ( 'a.txt' , 'wb' )) # 使用dump直接把对象序列化为file-like Object,注意是二进制存储 |
2.从磁盘读取到内存对象
1
|
pickle.load( open ( 'a.txt' , 'rb' )) #从file-like Object中直接反序列化出对象 |
星辰大海