在写代码的时候,有的时候不知道什么时候用何种格式,字符串跟对象转换的时候,到底是用dump还是load.dumps或者loads, 每次都是蒙的,要么就去查,一点效率都没有。
现在总结了一下: python里面,json和pickle是两种数据格式,文件格式。他们都可以用dump和dumps来解析,用load和loads来组装。OK,有什么区别呢?
带S和不带S有什么区别呢?没带S的是处理文件的。带S是处理字符串或者对象的。
不带S的是单数,要处理简单的;带S是复数,当然要处理繁杂的。
dump,这个让我联想到下饺子(Dumplings),一锅就散开了,就是整体分散。(将字典转化为string)
load,这个让我联想到游戏加载(loading),所有文件下载,就是分散到整体。(将string转化为字典)
OK,这样就好记忆多了。年纪大了,没办法,记不住。
JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。特点:简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。
1、json.dumps()和json.loads()是json格式处理函数(可以这么理解,json是字符串)
json.dumps()函数是将一个Python数据类型列表进行json格式的编码(可以这么理解,json.dumps()函数是将字典转化为字符串) json.loads()函数是将json格式数据转换为字典(可以这么理解,json.loads()函数是将字符串转化为字典)
在json的编解码过程中,python 的原始类型与json类型会相互转换,具体的转化对照如下:Python 编码为 JSON 类型转换对应表:
Python | JSON |
---|---|
dict | object |
list, tuple | array |
str | string |
int, float, int- & float-derived Enums | number |
True | true |
False | false |
None | null |
JSON 解码为 Python 类型转换对应表:
JSON | Python |
---|---|
object | dict |
array | list |
string | str |
number (int) | int |
number (real) | float |
true | True |
false | False |
null | None |
2、json.dump()和json.load()主要用来读写json文件函数 实例如下:
import json,time# save data to json filedef store(data): with open('data.json', 'w') as fw: # 将字典转化为字符串 # json_str = json.dumps(data) # fw.write(json_str) # 上面两句等同于下面这句 json.dump(data,fw)# load json data from filedef load(): with open('data.json','r') as f: data = json.load(f) return data
if __name__ == "__main__": json_data = '{"login":[{"username":"aa","password":"001"},{"username":"bb","password":"002"}],"register":[{"username":"cc","password":"003"},{"username":"dd","password":"004"}]}' # 函数是将json格式数据转换为字典 data = json.loads(json_data) store(data)
data = load() print(data)
总结:不带s的用于操作文件,带s的用于数据类型的转换。
我一直搞不清pickle有什么用,有json就好了哈,能写文件就可以了啊,专门看了一下,它还是很好用的。
pickle是为了序列化/反序列化一个对象的,可以把一个对象持久化存储。比如你有一个对象,想下次运行程序的时候直接用,可以直接用pickle打包存到硬盘上。或者你想把一个对象传给网络上的其他程序,可以用pickle打包,然后传过去,那边的python程序用pickle反序列化,就可以用了。简单说就是把Python数据变成流的形式。保存为二进制是因为计算机只能字节码,不能识别python的各种数据类型如:列表,元祖,字典等,要想在计算机保存这些python数据类型,就需要将这些数据类型转换成二进制字节码来保存。
1、只能在python中使用,只支持python的基本数据类型。
2、可以处理复杂的序列化语法。(例如自定义的类的方法,游戏的存档等)
3、序列化的时候,只是序列化了整个序列对象,而不是内存地址。
4、pickle 使用场景:用于python特有的类型和python的数据类型间进行转换
5、pickle 四个功能:dumps,dump,loads,load
1、pickle.dump(obj, file, protocol=None,) # 必填参数obj表示将要封装的对象 # 必填参数file表示obj要写入的文件对象,file必须以二进制可写模式打开,即“wb” # 可选参数protocol表示告知pickler使用的协议,支持的协议有0,1,2,3,默认的协议是添加在Python3中的协议3。
2、pickle.load(file,*,fix_imports=True, encoding="ASCII", errors="strict") # 必填参数file必须以二进制可读模式打开,即“rb”,其他都为可选参数
3、pickle.dumps(obj):# 以字节对象形式返回封装的对象,不需要写入文件中
4、pickle.loads(bytes_object): # 从字节对象中读取被封装的对象,并返回
该模块中最重要的方法:
1、pickle.dump(‘python数据’,‘pickle文件’) # 将python数据转换并保存到pickle格式的文件内2、pickle.dumps(‘python数据’) # 将python数据转换为pickle格式的bytes字串3、pickle.load(‘pickle文件’) # 从pickle格式的文件中读取数据并转换为python类型4、pickle.loads(‘pickle字串’) # 将pickle格式的bytes字串转换为python的类型
例子
# dumps功能 import pickle data = ['aa', 'bb', 'cc'] # dumps 将数据通过特殊的形式转换为只有python语言认识的字符串 p_str = pickle.dumps(data) print(p_str) b'\x80\x03]q\x00(X\x02\x00\x00\x00aaq\x01X\x02\x00\x00\x00bbq\x02X\x02\x00\x00\x00ccq\x03e.
# loads功能 # loads 将pickle数据转换为python的数据结构 mes = pickle.loads(p_str) print(mes)['aa', 'bb', 'cc']
# dump功能 # dump 将数据通过特殊的形式转换为只有python语言认识的字符串,并写入文件 with open('D:/tmp.pk', 'w') as f: pickle.dump(data, f)
# load功能 # load 从数据文件中读取数据,并转换为python的数据结构 with open('D:/tmp.pk', 'r') as f: data = pickle.load(f)
好了,希望下次能熟练应用了。