主要内容:
1.序列化模块.
json
pickle
shelve(了解)
序列化模块:
为了把数据用于网络传输,
以及文件的读写操作.
序列化: 将数据转化成序列化字符串.
反序列化: 将序列化字符串转化成原数据.
序列化模块:序列化是创造一个序列.
如何把一个字典传给其他人,依赖之前的知识也可以做到,参考如下:
dic = {"a":123,"b":456} s = str(dic) p = eval(s) print(p,type(p)) print(p["a"])
因为eval可能存在安全性问题,所有不建议用eval.这里就要用到json了.
json:
优点:
# 适用于不同语言之间的,
# 但是可支持的数据类型:字符串,数字,列表,字典 bool。
pickle:
优点:
只用于python语言之间的.
可支持python所有的数据类型.
shelve(了解):只是python,小工具(文件方面).
# json:
# 数据通过网络发送给别人. json
# 写入文件 也用到json.
序列化过程:一个数据类型---->序列化的字符串
反序列化过程:序列化的字符串 ---> 它所对应的数据类型.
json有两对方法:
dumps loads
dump load
# 被json序列化的字符串:
#1,可以直接通过网络互相传输.
#2,可以在各个语言中通用.
示例:
import json dic ={"教室":"python","办公室":"老师"} s = json.dumps(dic) print(s) p = json.loads(s) print(p)
这里需要注意的是json.dump和json.load的问题
json.load只能读取一次jsondump写的内容,如果json.dump对一个文件写了两次,就会报错.如下:
import json dic = {"a":123,"b":"老师"} with open("1.txt",mode="w",encoding="utf-8") as f : json.dump(dic,f) json.dump(dic, f) with open("1.txt", mode="r", encoding="utf-8") as f: s = json.load(f) print(s)
如何修正这个问题呢?可以用json.dumps来解决.
如下:
import json dic = {"a":123,"b":"老师"} with open("1.txt",mode="w",encoding="utf-8") as f : s = json.dumps(dic) f.write(s+" ") f.write(s + " ") f.write(s + " ") f.write(s + " ") f.write(s + " ") f.write(s + " ") f.write(s + " ") f.write(s + " ") with open("1.txt", mode="r", encoding="utf-8") as f: for line in f: s = json.loads(line) print(s)
其他参数:
示例:
import json data = {'username':['李华','二愣子'],'sex':'male','age':16,'A':666} json_dic2 = json.dumps(data,sort_keys=True,indent=2,separators=('|','*'),ensure_ascii=False) print(json_dic2)
这里面要注意的是:
sort_keys 是指按key来排序,字母是按照ASCII码来排序的
indent 是指打印出来后往左偏移的量
separators 是指字典中的:和,用什么来替换.
ensure_ascii=False 显示中文
pickle 序列化模块
python语言网络交互使用的,他支持所有的python数据类型.
这个和json一样有两对方法
dumps和loads,dump和load
dumps和loads方法和json没有太大的区别,
示例:
import pickle tu1 = (1,2,4) s = pickle.dumps(tu1) p = pickle.loads(s) print(p)
但是dump和load是有区别的.而且还比较大
pickle.dump()可以多几次写入文件,而且pickle也可以通过pickle.load来获取,但是
pickle.load一次只能获取一次,所以可以通过异常处理来解决
示例:
import pickle tu1 = (1,2,4) with open("1.txt",mode="wb") as f: s = pickle.dump(tu1,f) s = pickle.dump(tu1,f) s = pickle.dump(tu1,f) s = pickle.dump(tu1,f) s = pickle.dump(tu1,f) with open("1.txt",mode="rb") as f : while 1 : try : p = pickle.load(f) print(p) except EOFError: break