• 常用模块-02


    常用模块-02

    一:什么是序列化

    在我们储存数据或网络传输数据的时候,我们需要对我们的对象进行处理,把对象处理成方便储存和传输的数据格式。
    这个过程就叫序列化。不同的序列化,结果不同,但是目的是一样的,都是为了存储和传输。、
    
    在python中存在的三种序列化的方案。
        1.pickle,可以将我们python中的任意数据类型转化成bytes并写入到文件中,同样也可以把文件写好的bytes转换回
                  python的数据,这叫做 反序列化。
        2.shelve,简单另类的一种序列化的方案,类似redis,可以作为一种小型的数据库来使用。
        3.json,将python中常见的字典、列表,转化成字符串,是目前前后端交互使用频率最高的一种数据格式。
    

    二:pickle(重点)

    pickle简单的说,就是把我们的python对象写入到文件中的一种解决方案,但是写入到文件的bytes,只能是计算机才能看懂。
        import pickle
        class Cat:
            def __init__(self,name,age):
                self.name = name
                self.age = age
            def catch(self):
                print(self.name,'抓老鼠')
        
        c = Cat('汤姆',56)
        
        bs = pickle.dumps(c)  # 序列化对象
        print(bs)
        
        cc = pickle.loads(bs)  # 把二进制反序列化成对象
        cc.catch()
    
    pickle中的dumps可以序列化一个对象,loads可以反序列化一个对象,使用dump还可以直接把对象写入到文件中
    
        f = open('filepath',mode='wb')
        pickle.dump(c,f)
        f.close()
        
        f = open('filepath',mode='rb',)
        cc = pickle.load(f)
        cc.catch()
    
    pickle还支持多个对象的写出。
        lst = [Cat('汤姆',21),Cat('杰瑞',20),Cat('alex',34)]
        
        f = open('filepath',mode='wb')
        
        for el in lst:
            pickle.dump(el,f)
        f.close()
        
        f = open('filepath',mode='rb')
        for i in range(len(lst)):
            cc = pickle.load(f)
            cc.catch()
    
    这样写并不好,因为在读的时候,并不知道有多少对象要读。 * 注意:不能一行一行的读,真的要写入或读取多个内容时,把内容装进
    list里,然后读和去都用list去操作。
    
        lst = [Cat('汤姆',21),Cat('杰瑞',20),Cat('alex',34)]
        f = open('filepath',mode='wb')
        pickle.dump(lst,f)
        
        f = open('filepath',mode='rb')
        ll = pickle.load(f)
        for el in ll:
            el.catch()
        注:pickle序列化的内容是二进制的内容(bytes)
    

    三:shevel

    shelve提供python的持久化操作,就是把数据写到硬盘上,在操作shelve的时候非常像在操作一个字典。
    
    import shelve
        
    shelf = shelve.open('sylar')
    # shelf['jay'] = '周杰伦'
    print(shelf['jay'])
    shelf.close()
    
    
    储存复杂数据
    s = shelve.open('sylar')
    s['jay'] = {'name':'阮小二','age':25,'hobby':'喝酒'}
    print(s['jay'])
    s.close()
    
    *有坑*
    '''尝试改变字典中的数据'''
    s = shelve.open('sylar')
    s['jay']['name'] = '立地太岁'
    s.close()
    
    
    '''并没有改变'''
    s = shelve.open('sylar')
    print(s['jay'])
    s.close()
    
    
    '''解决方案'''
    s = shelve.open('sylar',writeback=True)
    s['jay']['name'] = '立地太岁'
    s.close()
    
    s = shelve.open('sylar')
    print(s['jay'])
    s.close()
    
    
    writeback=True 可以动态的把我们修改的信息写入到文件中,而且还可以删除数据。
    
    s = shelve.open('sylar',writeback=True)
    del s['jay']
    s.close()
    
    s = shelve.open('sylar')
    print(s['jay'])
    s.close()
    
    
    s = shelve.open('sylar',writeback=True)
    s['阮小二'] = '立地太岁'
    s['活阎罗'] = '阮小五'
    s.close()
    
    s = shelve.open('sylar')
    '''像字典一样遍历'''
    for k in s:
        print(k)
    
    print(s.keys())  # 拿到所有key的集合
    for k in s.keys():
        print(k)
    
    for k,v in s.items():   # 像字典一样的操作
        print(k,v)
    s.close()   
    

    四:json(重点)

    json 是我们前后端交互的枢纽,相当于编程界的普通话,大家相互沟通用json。因为json的语法格式可以完美的
    表示出一个对象。json全程:javascript object notation,翻译过来叫js对象简谱。
    
        wf = {
            'name':'汪峰',
            'age':45,
            'hobby':'搞事情',
            'wife':{
                'name':'章子怡',
                'age':18,
                'hobby':['演戏','扔皮鞋']
        }
        }
    在python中这叫字典,但在javascript里这叫做json。用这样的数据结构可以完美的表示出任何对象,并且可以把对象完美的表示
    出来,只要代码格式比较好,可读性就很强,所以大家公认这一种数据结构作为数据交互的格式。
    
    
    如何把python字典转成json格式的字符串
        import json
        dic = {'a':'宋江','b':'卢俊义','c':'吴用'}
        s = json.dumps(dic)   #  把字典转换成json字符串
        print(s)
        
        结果:{"a": "u5b8bu6c5f", "b": "u5362u4fcau4e49", "c": "u5434u7528"}
    
    如何把样的结果处理成中文,在dumps的时候给出另一个参数ensure_ascii=False
        import json
        dic = {'a':'宋江','b':'卢俊义','c':'吴用'}
        s = json.dumps(dic,ensure_ascii=False)   #  把字典转换成json字符串
        print(s)
    
    
    把前端传来的json字符串转化成字典
    
        import json
        s = '{"a":"1","b":"2","c":"3"}'
        dic = json.loads(s)
        print(type(dic),dic)
    
    json也可以像pickle一样把序列化写入到文件中
        import json
        dic = {"a":"1","b":"2","c":"3"}
        f = open('test.json',mode='w',encoding='utf-8')
        json.dump(dic,f,ensure_ascii=False)   # 把对象打散成json写入到文件中
        f.close()
    
    # 读取文件
        f = open('test.json',mode='r',encoding='utf-8')
        dic = json.load(f)
        f.close()
        print(dic)
        
    
    注意:我们可以向同一个文件写入多个json串,但是读不行。
        import json
        lst = [{"a":1},{"b":2},{"c":3}]
        f = open('test.json',mode='w',encoding='utf-8')
        for el in lst:
            json.dump(el,f)
        f.close()
        注:文件中是一行的格式({"a": 1}{"b": 2}{"c": 3})
        
    这样在读取的时候时无法正常读取的,两套解决方案。
    第一套:把所有内容准备好统一进行写入和读取,这样可以处理数据量小的问题,数据量大了比较麻烦。
    第二套:不用dump,改用dumps写入,手动加"
    "换行和loads,对每一行分别进行处理。
    
    第二套方案:
        import json
        
        lst = [{"a":"特洛伊木马"},{"b":"城堡"},{"c":"天黑"}]
        
        # 写入
        f = open('test.json',mode='w',encoding='utf-8')
        for el in lst:
            s = json.dumps(el,ensure_ascii=False) + '
    ' # 手动写入换行
            f.write(s)
        f.close()
        
    # 读取
        f = open('test.json',mode='r',encoding='utf-8')
        for line in f:
            dic = json.loads(line.strip())
            print(dic)
        f.close()
    

    五:configparser 模块

    该模块适用于配置文件的格式与windsws ini文件类型,可以包含多个节(section)每个节可以有多个参数(键=值)
    import configparser
    
    config = configparser.ConfigParser()
        config['DEFAULT'] = {
            'sleep':1000,
            'session-time-out':30,
            'user-alive':9999    
        }
        
        config['TEST-DB'] = {
            'db_ip':'152.163.18.168',
            'port':'3306',
            'u_name':'root',
            'u_pwd':'1234'    
        }
        
        config['168-DB'] = {
            'db_ip':'152.168.10.11',
            'port':'3306',
            'u_name':'root',
            'u_pwd':'9630'
        }
        
        config['163-DB'] = {
            'db_ip':'136.125.63.21',
            'port':'3306',
            'u_name':'root',
            'u_pwd':'7894'
        }
        
        f = open('db.ini',mode='w')
        config.write(f)  # 写入文件名
        f.flush()
        f.close()
    
    
    读取文件信息
    
    config = configparser.ConfigParser()
    
    config.read('db.ini')   #  读取文件
    print(config.sections())   # 获取到section,DEFAULT是每个章节都配备的信息
    print(config.get('DEFAULT','session-time-out')) # 从xxx章节中读取到xxx信息
    
    
    '''像字典一样,可以执行字典的操作'''
    print(config['TEST-DB']['db_ip'])
    print(config['163-DB']['db_ip'])
    
    for k in config['163-DB']:
        print(k)
    
    for k,v in config['163-DB'].items():
        print(k,v)
    
    print(config.options('163-DB'))  # 同for循环,找到'163-DB'下所有键
    print(config.items('163-DB'))   # 找到'163-DB'下所有键值对
    print(config.get('163-DB','db_ip'))  # get方法Setion下的key对应的value
    
    
    增删改查
    
    # 先读取,然后修改,最后写回文件
    
        import configparser
        config = configparser.ConfigParser()
        config.read('db.ini')   #  读取文件
        
    
    # 添加章节
        config.add_section('178-DB')
        config['178-DB'] = {
            'db_ip':'156.654.236.32',
            'port':'3306',
            'u_name':'root',
            'u_pwd':'0000'
        }
        
    
    # 修改信息
        config.set('163-DB','db_ip','10.11.12.13')
        
    
    # 删除章节
        config.remove_section('178-DB')
        
    
    # 删除元素信息
        config.remove_option('163-DB','u_name')
        
    
    # 写回文件
        config.write(open('db.ini',mode='w')) 
  • 相关阅读:
    SharePoint研究之表单登录配置
    asp.net自定义控件之加载层
    可替换参数在SharePoint和VS中的使用
    C#树类型及其遍历
    Asp.net下拉树实现(Easy UI ComboTree)
    驾校考试科目三心得
    c#pdf查看器
    jquery获取服务器控件Label的值
    [JLOI2014] 松鼠的新家 (lca/树上差分)
    洛谷P1445 [Violet] 樱花 (数学)
  • 原文地址:https://www.cnblogs.com/zhao-peng-/p/9813473.html
Copyright © 2020-2023  润新知