json、pickle模块
json、pickle模块
-
json是将数据转换成特殊的字符串然后传输,pickle是之间转换成bytle形式进行传输
-
json转换有限制,pickle没有并且可以直接对函数和类进行转换
-
json适合多种语言之间传输转换,而pickle只能在python中使用
-
序列化模块:将一种数据结构(list、tuple、dict....)转化成特殊的序列
-
为什么存在序列化:
-
数据在存储的过程中是以str(bytes)形式存储,比如字典,数据通过网络传输也是bytes类型,但是
dict----->str<----->bytes,bytes不能和字典、元组等等类型进行转换只能和str进行转换
-
-
特殊字符串:序列化
pickle模块
-
不同语言都遵循一种数据转化格式,即不同语言都使用的特殊字符串。(比如python的一个列表[1,2,3]利用json转化成特殊的字符串,然后在编码成bytes发送给php的开发者,php的开发者就可以解码成特殊的字符串,然后在反解成原数组(php中的列表称为数组[1,2,3])
-
json序列化只支持部分python数据结构:dict、list、tuple、str、int、float、True、False、None
-
json:将数据结构转化成特殊的字符串,并且可以反转回去
-
网络传输:
-
dumps,loads主要用于网络传输,但也可以用来读写文件(进行文件读写的时候不用转换成bytes是因为open内部已经对文件进行了转换)
-
dumps将数据类型(以下举例的是dict)转换成特殊字符串,
dic={'name':'xiaoxiannv','age':20} import json s1=json.dumps(dic,ensure_ascii=False) #ensure_ascii=False将元素里面的中文转换成中文格式 print(s1,type(s1)) 得: {"name": "xiaoxiannv", "age": 20} <class 'str'>
-
loads 将特殊字符串转换成之前的数据类型
dic={'name':'xiaoxiannv','age':20} import json s1=json.dumps(dic,ensure_ascii=False) #ensure_ascii=False将元素里面的中文转换成中文格式 print(s1,type(s1)) s2=json.loads(s1) print(s2,type(s2)) 得: {"name": "xiaoxiannv", "age": 20} <class 'str'> {'name': 'xiaoxiannv', 'age': 20} <class 'dict'>
-
dumps将非字符串转化成特殊字符串写入文件,loads将特殊字符读取出来转换成原本的数据类型
dic={'name':'xiaoxiannv','age':20} import json with open('json文件',mode='w',encoding='utf-8')as f1: s1=json.dumps(dic,ensure_ascii=False) f1.write(dic) #将特殊字符读取出来转换成原本的数据类型 with open('json文件',mode='r',encoding='utf-8')as f1: s2=f1.read() d1=json.loads(s2) print(d1,type(d1))
-
-
dump,load(绝对不能用于一次性写入多个数据,否则报错)
-
只能读写入文件,只能读写入一个数据结构
dic={'name':'xiaoxiannv','age':20} import json with open('json文件',mode='w',encoding='utf-8')as f1: s1=json.dump(dic,f1) #内部已经调用了write和read with open('json文件',mode='r',encoding='utf-8')as f2: d1=json.load(f2) print(d1,type(d1))
-
-
一次性写入多个数据
dic={'name':'xiaoxiannv','age':20} dic1={'name':'wangminmin','age':18} dic2={'name':'xiaotong','age':18} # 写入 with open('wenjian.txt',mode='w',encoding='utf-8')as f1: f1.write(json.dumps(dic)+'\n') f1.write(json.dumps(dic1)+'\n') f1.write(json.dumps(dic2)+'\n') # 读取 with open('wenjian.txt',mode='r',encoding='utf-8')as f2: for i in f2: print(json.loads(i)) # {'name': 'xiaoxiannv', 'age': 20} # {'name': 'wangminmin', 'age': 18} # {'name': 'xiaotong', 'age': 18}
pickle模块
-
只能是python语言遵循的一种数据转化格式,只能在python语言中使用。
-
只支持python所有的数据类型包括实例化对象
-
pictle模块:将数据结构转化成bytes,并且可以反转回去(pickle中的dumps和loads不能进行文件操作)
dic={'name':'xiaoxiannv','age':20} import pickle b1=pickle.dumps(dic) print(b1,type(b1)) d2=pickle.loads(b1) print(d2,type(d2)) 得: b'\x80\x03}q\x00(X\x04\x00\x00\x00nameq\x01X\x06\x00\x00\x00\xe5\xae\x9d\xe5\x88\xa9q\x02X\x03\x00\x00\x00ageq\x03K\x14u.' <class 'bytes'> {'name': 'xiaoxiannv', 'age': 20} <class 'dict'>
-
pickle模块中的dump和local可以进行写入多个文件
dic={'name':'xiaoxiannv','age':20} dic1={'name':'wangminmin','age':18} dic2={'name':'xiaotong','age':18} # with open('wen.txt',mode='wb')as f1: pickle.dump(dic,f1) pickle.dump(dic1,f1) pickle.dump(dic2,f1) with open('wen.txt',mode='rb')as f1: while True: try: print(pickle.load(f1)) except EOFError: break