• 2018.10.17学习总结


    """
    pickle是一个用来序列化的模块
    序列化是什么?
    指的是将内存中的数据结构转化为一种中间格式 并存储到硬盘上

    反序列化?
    将硬盘上存储的中间格式数据在还原为内存中的数据结构

    为什么要序列化?
    就是为了将数据持久存储
    之前学过的文件也能完成持久化存储 但是操作起来非常麻烦

    pickle模块主要功能
    dump
    load
    dumps
    loads
    dump是序列化
    load反序列化
    不带s的是帮你封装write read 更方便

    load函数可以多次执行 每次load 都是往后在读一个对象 如果没有了就抛出异常Ran out of input


    """


    import pickle
    # 用户注册后得到的数据
    name = "高跟"
    password = "123"
    height = 1.5
    hobby = ["吃","喝","赌","飘",{1,2,3}]


    # with open("userdb.txt","wt",encoding="utf-8") as f:
    # text = "|".join([name,password,str(height)])
    # f.write(text)

    # pickle支持python中所有的数据类型
    user = {"name":name,"password":password,"height":height,"hobby":hobby,"test":3}


    # 序列化的过程
    # with open("userdb.pkl","ab") as f:
    # userbytes = pickle.dumps(user)
    # f.write(userbytes)


    # 反序列化过程
    # with open("userdb.pkl","rb") as f:
    # userbytes = f.read()
    # user = pickle.loads(userbytes)
    # print(user)
    # print(type(user))
    #

    #dump 直接序列化到文件
    # with open("userdb.pkl","ab") as f:
    # pickle.dump(user,f)

    # #load 从文件反序列化
    with open("userdb.pkl","rb") as f:
    user = pickle.load(f)
    print(user)
    print(pickle.load(f))再读下一行文件里没数据就会报错
    print(pickle.load(f))
    print(pickle.load(f))


    # def myload(filename):
    # with open(filename,"rb") as f:
    # return pickle.load(f)
    #

    """
    2 shelve模块 也用于序列化
    它于pickle不同之处在于 不需要关心文件模式什么的 直接把它当成一个字典来看待
    它可以直接对数据进行修改 而不用覆盖原来的数据
    而pickle 你想要修改只能 用wb模式来覆盖

    """

    import shelve
    # user = {"name":"高根"}
    # s = shelve.open("userdb.shv")
    # s["user"] = user
    # s.close()


    s = shelve.open("userdb.shv",writeback=True)
    print(s["user"])
    s["user"]["age"] = 20
    s.close()

    3json的介绍和pickle,shevle对比
    """
    pickle 和 shevle 序列化后得到的数据 只有python才能解析
    通常企业开发不可能做一个单机程序 都需要联网进行计算机间的交互
    我们必须保证这个数据 能够跨平台使用


    JSON是什么? java script object notation 就是的对象表示法
    var obj = {"name":"egon"}
    对于我们开发而言 json就是一种通用的数据格式 任何语言都能解析

    js 中的数据类型 python数据类型 的对应关系
    {} 字典
    [] list
    string "" str
    int/float int/float
    true/false True/False
    null None

    json格式的语法规范
    最外层通常是一个字典或列表
    {} or []
    只要你想写一个json格式的数据 那么最外层直接写{}
    字符串必须是双引号
    你可以在里面套任意多的层次

    json模块的核心功能
    dump
    dumps
    load
    loads
    不带s 封装write 和 read


    """
    mport json

    # 反序列化
    # with open("a.json","rt",encoding="utf-8") as f:
    # res = json.loads(f.read())
    # print(type(res))

    # with open("a.json",encoding="utf-8") as f:
    # print(json.load(f))


    # 直接解析字符串的json为python对象

    jsontext = """{
    "users": [{
    "name": "agon",
    "age": 68
    },
    {
    "name": "agon",
    "age": 68
    }
    ]
    }"""

    # res = json.loads(jsontext)
    # print(res)


    mydic = {
    "users": [{
    "name": "agon",
    "age": 68
    },
    {
    "name": "agon",
    "age": 68
    }
    ]
    }
    # with open("b.json","wt",encoding="utf-8") as f:
    # f.write(json.dumps(mydic))

    # with open("b.json", "wt", encoding="utf-8") as f:
    # json.dump(mydic, f)

    import json

    # dic = {"a": '理查德姑妈', "b": "找到你", "c": "看不见的客人"}
    # with open("c.json","wt",encoding="utf-8") as f:
    # f.write(json.dumps(dic))
    # print(repr(s), type(s))#repr把任意字符串转化为解释器可以理解的形式

    # with open("c.json","rt",encoding="utf-8") as f:
    # # print(f.read())
    # d = json.loads(f.read())
    # print(d)

    4 """XML 可扩展的标记语言
    <></>
    也是一种通用的数据格式
    之所用用它也是因为跨平台

    学习的重点还是语法格式
    一、任何的起始标签都必须有?一个结束标签。
    <> </>
    二、可以采用另一种简化语法,可以在一个标签中同时表示起始和结束标
    签。这种语法是在?于符号之前紧跟一个斜线(/),XML
    解析器会将其翻译成<百度百科词条></百度百科词条>。
    例例如<百度百科词条/>。

    三、标签必须按合适的顺序进?行行嵌套,所以结束标签必须按镜像顺序匹配
    起始标签。这好?比是将起始和结束标签看作是数学中的左右括号:在没有关闭所有
    的内部括号之前,是不不能关闭外?面的括号的。
    四、所有的特性都必须有值。
    五、所有的特性都必须在值的周围加上双引号。
    一个标签的组成部分
    <tagename 属性名称="属性值">文本内容
    </tagname>

    单标签的写法
    <tagename 属性名称="属性值"/>

    # 镜像关闭顺序实例
    <a>
    <b>
    <c>
    </c>
    </b>
    </a>

    把你左右同学的信息写成xml
    <studentinfo>
    <张三>
    <age>20</age>
    <gender>man</gender>
    </张三>
    <李四>
    <age>20</age>
    <gender>man</gender>
    </李四>
    </studentinfo>

    总结 xml也是一种中间格式 也属于序列化方式之一
    与json相比较
    同样的数据 json会比xml 更小 效率更高
    xml 需要根据文档结构 手动解析 而json 直接转对象


    """
    import xml.etree.ElementTree as ElementTree
    # 解析d.xml
    tree = ElementTree.parse("d.xml")
    print(tree)
    # 获取根标签
    rootTree = tree.getroot()

    # 三种获取标签的方式
    # 获取所有人的年龄 iter是用于在全文范围获取标签
    # for item in rootTree.iter("age"):
    # # 一个标签三个组成部分
    # print(item.tag) # 标签名称
    # print(item.attrib) # 标签的属性
    # print(item.text) # 文本内容

    # 第二种 从当前标签的子标签中找到一个名称为age的标签 如果有多个 找到的是第一个
    # print(rootTree.find("age").attrib)
    # 第三种 从当前标签的子标签中找到所有名称为age的标签
    不会找下个级别内的内容
    # print(rootTree.findall("age"))


    # 获取单个属性
    stu = rootTree.find("stu")#找到一个子标签
    print(stu.get("age"))#获取子标签里的属性值
    print(stu.get("name"))

    # 删除子标签
    rootTree.remove(stu)#删除内存里的数据
    stu = rootTree.find("stu")#再获取一次获得其他同级别的属性
    print(stu.get("name"))


    # 添加子标签
    # 要先创建一个子标签
    newTag = ElementTree.Element("这是新标签",{"一个属性":"值"})
    rootTree.append(newTag)

    # 写入文件
    获取子标签下面的标签要iter循环进行获取
    tree.write("f.xml",encoding="utf-8")
    import xml.etree.ElementTree as ElementTree
    tree = ElementTree.parse("f.xml")
    rootTree = tree.getroot()
    users = []
    for item in rootTree.iter("stu"):
    user = item.attrib
    print(user)
    gitem = item.find("girlfriend")
    user["girlfriend"] = gitem.attrib
    users.append(user)
    print(users)

    ""
    5 config parser
    用于解析配置文件的模块
    何为配置文件
    包含配置程序信息的文件就称为配置文件
    什么样的数据应作为配置信息
    需要改 但是不经常改的信息 例如数据文件的路径 DB_PATH

    配置文件中 只有两种内容
    一种是section 分区
    一种是option 选项 就是一个key=value形式

    我们用的最多的就是get功能 用来从配置文件获取一个配置选项

    练习:
    做一个登录 首先查看配置文件 是否又包含 用户名和密码 如果由直接登录 如果没有就进行输入用户名密码登录
    登录成功后 询问是否要保存密码 如果是 写入配置文件

    """
    import configparser
    # 创建一个解析器
    config = configparser.ConfigParser()
    # 读取并解析test.cfg
    config.read("test.cfg",encoding="utf-8")
    # 获取需要的信息
    # 获取所有分区
    # print(config.sections())
    # 获取所有选项
    # print(config.options("user"))
    # 获取某个选项的值
    # print(config.get("path","DB_PATH"))
    # print(type(config.get("user","age")))
    #
    # # get返回的都是字符串类型 如果需要转换类型 直接使用get+对应的类型(bool int float)
    # print(type(config.getint("user","age")))
    # print(type(config.get("user","age")))

    # 是否由某个选项
    config.has_option()#输入分区和选项比如usr,name返回bool
    # 是否由某个分区
    # config.has_section()#输入分区返回bool

    # 不太常用的
    # 添加
    # config.add_section("server")
    # config.set("server","url","192.168.1.2")
    # 删除
    # config.remove_option("user","age")
    # 修改
    # config.set("server","url","192.168.1.2")

    # 写回文件中
    # with open("test.cfg", "wt", encoding="utf-8") as f:
    # config.write(f)

  • 相关阅读:
    ElasticSearch调优问题
    Ceph源码解析:概念
    Ceph神坑系列
    Mac下VirtualBox共享文件夹设置
    API教程
    设计师最常用网站汇总
    从码农到大神,有多少经验值得借鉴?
    登录注册 页面
    NET面试题 (四)
    Sqlserver面试题
  • 原文地址:https://www.cnblogs.com/jutao/p/9863494.html
Copyright © 2020-2023  润新知