• python中常用的模块二


    一.序列化

    指:在我们存储数据的时候,需要对我们的对象进行处理,把对象处理成方便存储和传输的数据格式,这个就是序列化,

    不同的序列化结果不同,但目的是一样的,都是为了存储和传输.

    一,pickle.可以将我们python中的任意数据类型转化成bytes并写入到文件中.

    同样也可以把文件中写好的bytes转换回我们的python的数据.这个过程被称为序列化

    import pickle
    class Cat:
     def __init__(self, name, age):
     self.name = name
     self.age = age
     def catchMouse(self):
     print(self.name, "抓⽼⿏")
    c = Cat("jerry", 18)
    bs = pickle.dumps(c) # 序列化一个对象.
    print(bs) # 一堆二进制. 看不懂
    cc = pickle.loads(bs) # 把二进制反序列化成我们的对象
    cc.catchMouse() # 猫依然是猫. 还可以抓老鼠
    
    pickle中的dumps可以序列化一个对象. loads可以反序列化一个对象. 我们使用dump
    还可以直接 把一个对象写入到文件中
    # f = open("cat", mode="wb")
    # pickle.dump(c, f) # 写到⽂件中
    # f.close()
    f = open("cat", mode="rb")
    cc = pickle.load(f) # 从文件中读取对象
    cc.catchMouse()
    

     pickle还⽀持多个对象的写出.

    lst = [Cat("jerry", 19), Cat("tommy", 20), Cat("alpha", 21)]
    f = open("cat", mode="wb")
    for el in lst:
     pickle.dump(el, f) # 写⼊到⽂件中
    f.close()
    f = open("cat", mode="rb")
    for i in range(len(lst)):
     cc = pickle.load(f) # 从⽂件中读取对象
     cc.catchMouse()
    lst = [c1, c2, c3]
    f = open("cat.dat", mode="ab")
    pickle.dump(lst, f) # 把对象写到文件中
    
    f = open("cat.dat", mode="rb")
    lst = pickle.load(f) # 读取第一次
    for cc in lst:
        cc.chi()
    
    用户注册与登录
    class User:
        def __init__(self, username, password):
            self.username = username
            self.password = password
    
    class client:
        def regist(self):
            uname = input("please input your username:")
            pwd = input("please input your password:")
            user = User(uname, pwd)
            pickle.dump(user, open("userinfo", mode="ab"))
            print("regist successful!!!")
    
        def login(self):
            uname = input("please input your username:")
            pwd = input("please input your password:")
            f = open("userinfo", mode="rb")
            while 1:
                try:
                    u = pickle.load(f) # 从文件里把对象拿出来
                    if u.username == uname and u.password == pwd:
                        print("login successful !!")
                        break
    
                except Exception as e:
                    print("login failed !!!")
                    break
    
    c = client()
    # c.regist()
    # c.regist()
    # c.regist()
    # c.regist()
    c.login()
    

     三.shelve

    shelve. 简单另类的一种序列化的方案. 有点⼉类似redis. 可以作为 一种小型的数据库来使用

    shelve提供python的持久化操作就是把数据写到硬盘上. 在操作shelve的时候非常的像操作一个字典

    import shelve
    shelf = shelve.open("sylar")
    # shelf["jay"] = "周杰伦"
    print(shelf['jay'])
    shelf.close()
    

     我们存储 ⼀些复杂的数据 

    我们存储一些复杂的数据
    s = shelve.open("sylar")
    # s["jay"] = {"name":"周杰伦", "age":18, "hobby":"哄⼩孩"}
    print(s['jay'])
    s.close()
    修改时注意需添加参数writeback=True
    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['jay'] = "周杰伦"
    s['wlj'] = "王力宏"
    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. 将python中常用的字典, 列表转化成字符串. 是目前前后端数据交互使用频率 最高的一种数据格式.

    json是我们前后端交互的枢纽. 相当于编程界的普通话. 大家沟通都用 json.因为json的语法格式可以完美的表示出一个对象.

    json全 称javascript object notation. 翻译过来叫js对象

    wf = {
        "name":"汪峰",
         "age":18,
         "hobby":"上头条",
         "wife":{
                "name":'⼦怡',
                 "age":19,
     "hobby":["唱歌", "跳舞", "演戏"]
     }
    

      用xml写

    <?xml version="1.0" encoding="utf-8" ?>
    <wf>
         <name>汪峰</name>
        <age>18</age>
         <hobby>上头条</hobby>
         <wife>
                <name>子怡</name>
                <age>18</age>
                 <hobbies>
                         <hobby>唱歌</hobby>
                         <hobby>跳舞</hobby>
                         <hobby>演戏</hobby>
                  </hobbies>
           </wife>
    
    </wf>
    

      json案例

    import  json
    例一
    # 准备一个字典
    dic = {"a": "小萝莉", "b": "大萝莉", "c": "猥琐大叔", "d": False, "e": None}
    # python中可以直接把字典或者列表转化成json
    s = json.dumps(dic, ensure_ascii=False)  # pickle
    print(type(s))
    print(s)
    例二
    s = '{"a": "小萝莉", "b": "大萝莉", "c": "猥琐大叔", "d": false, "e": null}'
    d = json.loads(s) # 把json转化成字典
    print(d)
    print(type(d))
    
    
    例三
    dic = {"a": "小萝莉", "b": "大萝莉", "c": "猥琐大叔", "d": False, "e": None, "wf":{"name":"半壁江山", "hobby":"皮裤"}}
    f = open("sylar.json", mode="w", encoding="utf-8")
    json.dump(dic, f, ensure_ascii=False, indent=4) # 4个空格 = 1个tab
    
    f = open("sylar.json", mode="r", encoding="utf-8")
    d = json.load(f)
    print(d)
    例四
    class Person:
        def __init__(self, firstName, lastName):
            self.firstName = firstName
            self.lastName = lastName
    
    s = '{"firstName": "尼古拉斯", "lastName": "刘能"}'
    def func(dic):
        return Person(dic['firstName'], dic["lastName"])
    p = json.loads(s, object_hook=func) # 通过函数func把字典转换回对象
    print(p.firstName, p.lastName)
    p = Person("尼古拉斯", "刘能")
    例五
    #把对象转换成json
    s = json.dumps(p.__dict__, ensure_ascii=False) # 方案一, 转的是字典
    def func(obj):
        return {
            "firstName": obj.firstName,
            "lastName": obj.lastName
        }
    s = json.dumps(p, default=func, ensure_ascii=False) # 方案二 转化的也是字典
    print(s)
    例六
    dic1 = {"name":'毒液', "评分": "0.9"}
    dic2 = {"name":'与神同行', "评分": "10"}
    dic3 = {"name":'看不见的客人', "评分": "9.5"}
    lst = [dic1, dic2, dic3]
    f = open("movie.json", mode="w", encoding="utf-8")
    for d in lst:
        s = json.dumps(d, ensure_ascii=False)
        f.write(s+"
    ")
    
    f = open("movie.json", mode="r", encoding="utf-8")
    dic1 = json.load(f) # 当json文件中保存多个json的时候不能一次性全部都读取出来
    print(dic1)
    
    f = open("movie.json", mode="r", encoding="utf-8")
    for line in f:
        line = line.strip()
        if line == "":
            continue
        else:
            d = json.loads(line) # 一行一行的处理
            print(d)
    

     五 configparser模块

    该模块适⽤于配置⽂件的格式与windows ini文件类似,可以包含一个或多个节(section)每个节 可以有多个参数(键=值). 首先, 我们先看一个xxx服务器的配置文件

    import configparser
    config = configparser.ConfigParser() # 创建对象
    
    config['DEFAULT'] = {  # 特殊
        "name":"腾讯qq木马",
        "time":"qq更新时间",
        "version":"1.0"
    }
    config['SERVER_1'] = {
        "IP":"192.168.1.123",
        "port":"12306"
    }
    config['SERVER_2'] = {
        "IP":"192.168.1.178",
        "port":"12311"
    }
    config['SERVER_3'] = {
        "IP":"192.168.1.176",
        "port":"12312"
    }
    
    # 写入到文件
    config.write(open("qq.ini", mode="w", encoding="utf-8"))
    
    
    # 读取内容
    config = configparser.ConfigParser()
    # 读取内容
    config.read("qq.ini", encoding="utf-8") # 此时我们把文件中的内容读取到config
    print(config['SERVER_1']['IP']) # 字典
    print(config['SERVER_2']['name'])
    print(config.get("SERVER_3", "IP")) # 字典
    
    for k, v in config['DEFAULT'].items():
        print(k, v)
    
    # config = configparser.ConfigParser()
    # # 读取内容
    # config.read("qq.ini", encoding="utf-8") # 此时我们把文件中的内容读取到config
    # config['SERVER_1']['NAME'] = "哈哈哈"
    # config.write(open("qq.ini", mode="w", encoding="utf-8"))
    

     

    # 先读取. 然后修改. 最后写回文件
    config = configparser.ConfigParser()
    config.read("db.ini") # 读取文件
    # 添加一个章节
    # config.add_section("189-DB")
    # config["189-DB"] = {
    # "db_ip": "167.76.22.189",
    # "port": "3306",
    # "u_name": "root",
    # "u_pwd": "123456"
    # }
    # 修改信息
    config.set("168-DB", "db_ip", "10.10.10.168")
    # 删除章节
    config.remove_section("173-DB")
    # 删除元素信息
    config.remove_option("168-DB", "u_name")
    # 写回文件
    config.write(open("db.ini", mode="w"))
    

      

  • 相关阅读:
    _1_html_框架
    _0_web_基础
    _0_工具
    虚拟机安装与使用
    NumPy数据类型
    NumPy Ndarray对象
    机器学习之K-近邻(KNN)算法
    vue项目如何打包扔向服务器
    Eslint 规则说明
    Python ssh 远程执行shell命令
  • 原文地址:https://www.cnblogs.com/liucsxiaoxiaobai/p/9966814.html
Copyright © 2020-2023  润新知