Python 入门之 内置模块 -- 序列化模块(json模块、pickle模块)
python 入门之 内置模块 -- 序列化模块(json模块、pickle模块)
1、序列化
python中这种序列化模块有三种:
json模块 :
不同语言都遵循的一种数据转化格式,即不同语言都使用的特殊字符串。(比如python的一个列表[1, 2, 3]利用json转化成特殊的字符串,然后在编码成bytes发送给php的开发者,php的开发者就可以解码成特殊的字符串,然后在反解成原数组(列表): [1, 2, 3])
json序列化只支持部分python数据结构:dict,list, tuple,str,int, float,true,false,none
pickle模块:
只能是python语言遵循的一种数据转化格式,只能在python语言中使用。
支持python所有的数据类型包括实例化对象。
shelve模块:类似于字典的操作方式去操作特殊的字符串。
序列化的本质就是将一种数据结构(如字典,列表)等转换成一个特殊的序列(字符串或者bytes)的过程就叫做序列化。
(1)序列化模块就是将一个常见的数据结构转化成一个特殊的序列,并且这个特殊的序列还可以反解回去。
(2)主要用途:
<1> 文件读写数据
<2> 网络传输数据
(3)json模块
<1> json模块是将满足条件的数据结构转化成特殊的字符串,并且也可以反序列化还原回去
<2> 能够序列的数据类型:字典,列表,元组
4方法 2组
dumps loads ---- 用于网络传输
dump load ---- 用于文件存储
1> dumps、loads
[1] 将字典类型转换成字符串类型
import json dic = {'k1':'v1','k2':'v2','k3':'v3'} str_dic = json.dumps(dic) #序列化:将一个字典转换成一个字符串 print(type(str_dic),str_dic) #<class 'str'> {"k3": "v3", "k1": "v1", "k2": "v2"} #注意,json转换完的字符串类型的字典中的字符串是由""表示的
[2] 将字符串类型的字典转换成字典类型
import json dic2 = json.loads(str_dic) #反序列化:将一个字符串格式的字典转换成一个字典 #注意,要用json的loads功能处理的字符串类型的字典中的字符串必须由""表示 print(type(dic2),dic2) #<class 'dict'> {'k1': 'v1', 'k2': 'v2', 'k3': 'v3'}
[3] 还支持列表类型
list_dic = [1,['a','b','c'],3,{'k1':'v1','k2':'v2'}] str_dic = json.dumps(list_dic) #也可以处理嵌套的数据类型 print(type(str_dic),str_dic) #<class 'str'> [1, ["a", "b", "c"], 3, {"k1": "v1", "k2": "v2"}] list_dic2 = json.loads(str_dic) print(type(list_dic2),list_dic2) #<class 'list'> [1, ['a', 'b', 'c'], 3, {'k1': 'v1', 'k2': 'v2'}]
2> dump、load
[1] 将对象转换成字符串写入到文件当中
import json f = open('json_file.json','w') dic = {'k1':'v1','k2':'v2','k3':'v3'} json.dump(dic,f) #dump方法接收一个文件句柄,直接将字典转换成json字符串写入文件 f.close() # json文件也是文件,就是专门存储json字符串的文件。
[2] 将文件中的字符串类型的字典转换成字典
import json f = open('json_file.json') dic2 = json.load(f) #load方法接收一个文件句柄,直接将文件中的json字符串转换成数据结构返回 f.close() print(type(dic2),dic2)
其他参数说明
ensure_ascii
:,当它为true的时候,所有非ascii码字符显示为\uxxxx序列,只需在dump时将ensure_ascii设置为false即可,此时存入json的中文即可正常显示。
separators
:分隔符,实际上是(item_separator, dict_separator)的一个元组,默认的就是(,,:);这表示dictionary内keys之间用“,”隔开,而key和value之间用“:”隔开。
sort_keys
:将数据根据keys的值进行排序。
json序列化存储多个数据到同一个文件中
对于json序列化,存储多个数据到一个文件中是有问题的,默认一个json文件只能存储一个json数据,但是也可以解决,举例说明:
对于json 存储多个数据到文件中 dic1 = {'name':'oldboy1'} dic2 = {'name':'oldboy2'} dic3 = {'name':'oldboy3'} f = open('序列化',encoding='utf-8',mode='a') json.dump(dic1,f) json.dump(dic2,f) json.dump(dic3,f) f.close() f = open('序列化',encoding='utf-8') ret = json.load(f) ret1 = json.load(f) ret2 = json.load(f) print(ret)
上边的代码会报错,解决方法:
dic1 = {'name':'oldboy1'} dic2 = {'name':'oldboy2'} dic3 = {'name':'oldboy3'} f = open('序列化',encoding='utf-8',mode='a') str1 = json.dumps(dic1) f.write(str1+'\n') str2 = json.dumps(dic2) f.write(str2+'\n') str3 = json.dumps(dic3) f.write(str3+'\n') f.close() f = open('序列化',encoding='utf-8') for line in f: print(json.loads(line))
(4)pickle模块
<1> pickle模块是将python所有的数据结构以及对象等转化成bytes类型,然后还可以反序列化还原回去
<2> 只有python有,几乎可以序列python中所有数据类型,匿名函数不能序列
使用上与json几乎差不多,也是两对四个方法。
dumps loads ---- 用于网络传输
dump load ---- 用于文件存储
1> dumps、loads
import pickle dic = {'k1':'v1','k2':'v2','k3':'v3'} str_dic = pickle.dumps(dic) print(str_dic) # bytes类型 dic2 = pickle.loads(str_dic) print(dic2) #字典 # 还可以序列化对象 import pickle def func(): print(666) ret = pickle.dumps(func) print(ret,type(ret)) # b'\x80\x03c__main__\nfunc\nq\x00.' <class 'bytes'> f1 = pickle.loads(ret) # f1得到 func函数的内存地址 f1() # 执行func函数
2> dump、load
dic = {(1,2):'oldboy',1:true,'set':{1,2,3}} f = open('pick序列化',mode='wb') pickle.dump(dic,f) f.close() with open('pick序列化',mode='wb') as f1: pickle.dump(dic,f1)
pickle序列化存储多个数据到一个文件中
dic1 = {'name':'oldboy1'} dic2 = {'name':'oldboy2'} dic3 = {'name':'oldboy3'} f = open('pick多数据',mode='wb') pickle.dump(dic1,f) pickle.dump(dic2,f) pickle.dump(dic3,f) f.close() f = open('pick多数据',mode='rb') while true: try: print(pickle.load(f)) except eoferror: break f.close()
自写一个pickle写入文件上下文
class mypickle: def __init__(self,path,mode='load'): self.path = path self.mode = 'ab' if mode=='dump' else 'rb' def __enter__(self): self.f = open(self.path, mode=self.mode) return self def dump(self,content): pickle.dump(content,self.f) def __exit__(self, exc_type, exc_val, exc_tb): self.f.close() def __iter__(self): while true: try: yield pickle.load(self.f) except eoferror: break class course: def __init__(self,name,price,period): self.name = name self.price = price self.period = period python = course('python',19800,'6 months') linux = course('linux',19800,'6 months') with mypickle('course_file') as p: for obj in p: print(obj.__dict__) with mypickle('course_file','dump') as p: p.dump(python) p.dump(linux) with open('course_file','ab') as f: pickle.dump(linux,f) with open('course_file','rb') as f: while true: try: obj = pickle.load(f) print(obj.__dict__) except eoferror: break
下一篇: 从“杨辉三角形”谈起
推荐阅读
-
Python3.5内置模块之time与datetime模块用法实例分析
-
Python3.5内置模块之shelve模块、xml模块、configparser模块、hashlib、hmac模块用法分析
-
Python3内置模块之json编解码方法小结【推荐】
-
Python3.5内置模块之os模块、sys模块、shutil模块用法实例分析
-
Python3.5内置模块之random模块用法实例分析
-
Python 入门之 内置模块 -- datetime模块
-
Python 入门之 内置模块 -- time模块
-
从零学python系列之浅谈pickle模块封装和拆封数据对象的方法
-
Python 入门之 模块
-
Python 序列化 pickle/cPickle模块使用介绍