【Python json&pickle模块&类&组合 09】
一、json模块
序列化(dump/dumps)反序列化(load/loads)
能在网络上传递的只有字节,而转成字节的只有字符串
1、dic(字典)--->通过json.dumps(dic)--->转换成json格式的str --->通过encode-->转换成字节-->在网络上传递
# 字典通过json转成str,然后转换成字节 import json dic = {'username':'admin','passwd':'admin'} print(dic,type(dic)) #{'username': 'admin', 'passwd': 'admin'} <class 'dict'> ret = json.dumps(dic) print(ret,type(ret)) #{"username": "admin", "passwd": "admin"} <class 'str'> uncode_1 = ret.encode('UTF-8') print(uncode_1,type(uncode_1)) #b'{"username": "admin", "passwd": "admin"}' <class 'bytes'>
2、字节转字符串:decode
# 字节转字符串 str = uncode_1.decode('utf-8') print(str,type(str)) #{"username": "admin", "passwd": "admin"} <class 'str'>
3、字符串转换成字典:json.loads
# 字符串转换成字典 dct = json.loads(str) print(dct,type(dct)) #{'username': 'admin', 'passwd': 'admin'} <class 'dict'>
# 把字典内的数据写到文件内
# 把字典内的数据写到文件内 context = {'北京':{'朝阳':{'望京':'SOHO'},'海淀':{'中关村':'海伦大厦'}}} str_con = json.dumps(context,ensure_ascii=False) #ensure_ascii=False 不按照ascii来转,确保中文直接可以写进去 with open('city',mode='w',encoding='utf-8') as f: f.write(str_con) f.close() # 读取文件内的数据,并且把读取出来的数据转成字典 with open('city',mode='r',encoding='utf-8') as f: str=f.read() dic = json.loads(str)
4、json数据类型是一个特殊的字符串,在任何语言中它的type都必须是字符串。但是还是需要满足一些要求:key必须是字符串,且value只能是:字典、列表、字符串、数字、布尔值
--------->字符串和字典/列表之间的转换<-----------
字典/列表 -->转字符串:dumps 字符串 = json.dumps(字典/列表)
字符串 --> 字典/列表:loads 字典/列表 = json.loads(字符串)
|- json是所有编程语言都公认的一种数据类型,如果Python要给Java发送消息,就可以转换成json发送
5、dump和load的用法
import json '''对比dumps和dump loads和load用法的区别''' context = {'北京':{'朝阳':{'望京':'SOHO'},'海淀':{'中关村':'海伦大厦'}}} str_con = json.dumps(context,ensure_ascii=False) #ensure_ascii=False 不按照ascii来转,确保中文直接可以写进去 with open('city',mode='w',encoding='utf-8') as f: f.write(str_con) f.close() lst = ['alex',1,2,3] with open('city','w',encoding='utf-8') as f: json.dump(lst,f) '''通过上面两种写法可以看出来:dump可以直接把列表/字典写入文件内,dumps是先把列表/字典先转换成json,然后再写入文件内''' with open('city',mode='r',encoding='utf-8') as f: str=f.read() dic = json.loads(str) print(dic,type(dic)) #['alex', 1, 2, 3] <class 'list'> with open('city',encoding='utf-8') as f: ret = json.load(f) print(ret,type(ret)) #['alex', 1, 2, 3] <class 'list'> '''通过上面两种写法可以看出来:load比loads少一个读的过程'''
# loads dumps 和内存交互
# load dump 和文件交互
二、pickle模块
1、python中特有的序列化模块
import pickle dic = {'北京':{'朝阳','昌平'},('天津','河北'):[1,2,3]} ret = pickle.dumps(dic) print(ret,type(ret)) d = pickle.loads(ret) print(d) '''pickle.dumps转换成计算机认识的类型(序列化),而pickle.loads同样可以反序列化'''
2、pickle和json的区别
- pickle 支持python中的几乎所有数据类型,但是只能python一种语言中使用
- json 支持所有的语言,但只支持有限的数据类型
三、类 class
''' 1、类是不能直接跟参数的,那么在调用类的时候,如果想给类传参数,Java中会有构造方法来给类传参,那么python 中没有构造方法的概念,但是可以用__init__(self)初始方法来解决 2、self相当于一块内存空间,把参数默认存放到一块内存空间内 3、self.后面的名称可以任意起名字,但是self=后面的必须是__init__内的参数 ''' class Persion: # 初始化方法 def __init__(self,name,sex,high,age): self.username = name #类似Java中的this.username=name self.sex = sex self.high = high self.age = age ret = Persion print(ret) #<class '__main__.Persion'> alex = Persion('张三','男',180,20) #实例化(java的实例化用new,而python直接调用类名+()就是实例化。如:per = Persion()) wusir = Persion('李四','女',186,18) print(alex.username) print(wusir.username)
四、组合
类之间相互的调用
# 计算一个圆环的周长和面 from math import pi #pi就是3.14 # Circle用于计算面积和周长 class Circle: def __init__(self, r): self.r = r def area(self): return self.r ** 2 * pi def round(self): return 2 * self.r * pi # Ring计算圆环的周长和面积 class Ring: def __init__(self, outer_r, inner_r): c1=Circle(outer_r) c2=Circle(inner_r) self.c1 = c1 self.c2 = c2 def area(self): return self.c1.area()-self.c2.area() def round(self): return self.c1.round()-self.c2.round() area = Ring(15,13) print(area.area()) print(area.round())