【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())

 

posted @ 2022-05-07 11:34  尘封~~  阅读(22)  评论(0编辑  收藏  举报