zoukankan      html  css  js  c++  java
  • PYTHON-模块 json pickle shelve xml

    """
    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 load
    dumps loads
    不带s 封装write 和 read
    """

    import json
    users = {'name':"音乐会","age":20,"hobbies":("music","movies")}
    # res1= json.dumps(users)
    # print(res1)
    # res=json.dump(users,open("users.json","wt",encoding="utf-8"))
    # print(res)

    # json的反序列化
    # jsonstr = json.load(open("users.json","r",encoding="utf-8"))
    # print(jsonstr,type(jsonstr))
    #
    # with open("users.json","rt",encoding="utf-8") as f:
    # jsonstr1 = json.loads(f.read())
    # print(jsonstr1,type(jsonstr1))


    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)
    # ==================================

    '''
    pickle
    一种python独有的序列化方式
    支持python中所有的类型
    dump load
    dumps loads
    '''
    # ====================================
    '''
    shelve
    一种python独有的序列化方式 进行了进一步封装 只有一个open函数
    得到一个shevle对象后 直接把它当成一个字典 通过key来存取

    它于pickle不同之处在于 不需要关心文件模式什么的 直接把它当成一个字典来看待
    它可以直接对数据进行修改 而不用覆盖原来的数据
    而pickle 你想要修改只能 用wb模式来覆盖
    '''
    import shelve
    # user = {"name":"高根"}
    # s = shelve-egon.open("userdb.shv")
    # s["user"] = user
    # s.close()

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

    # ==============================
    '''

    与json的区别
    XML相比较 更加重量级(贬义词) 同样的数据 xml格式占用更多空间
    最要命 解析非常麻烦 你需要知道xml到底是什么结构
    更多的是编写(照着模板填空) 解析的工作 通常框架已经做好了

    XML
    什么XML:全称 可扩展标记语言
    标记指的是代表某种含义的字符 XML<>
    为什么需要XML
    为能够在不同的平台间继续数据的交换
    为了使交换的数据能让对方看懂 就需要按照一定的语法规范来书写
    XML语法格式:
    一、任何的起始标签都必须有一个结束标签。
    <tagname></tagname>
    <tagname></tagname>
    <tagname/> 简化写法
    二、可以采用另一种简化语法,可以在一个标签中同时表示起始和结束标签。
    这种语法是在大于符号之前紧跟一个斜线(/),例如<百度百科词条/>。
    XML解析器会将其翻译成<百度百科词条></百度百科词条>。

    三、标签必须按合适的顺序进行嵌套,所以结束标签必须按镜像顺序匹配起始标签,例如这是一串百度百科中的样例字符串。这好比是将起始和结束标签看作是数学中的左右括号:在没有关闭所有的内部括号之前,是不能关闭外面的括号的。
    <tag1>
    <tag2>
    <tag3>
    </tag3>
    </tag2>
    </tag1> 大白话 关闭标签应该从内往外 一层一层关闭 顺序不能乱
    四、所有的特性都必须有值。
    特性指的是属性
    <person name="">
    </person>
    五、所有的特性都必须在值的周围加上双引号。


    注意:最外层有且只有一个标签 这个标签称之为根标签
    第一行应该有文档声明 用于高速计算机怎么理解
    例如:<?xml version="1.0" encoding="utf-8"?>
    当标签嵌套的时候会出现层级关系 如果一个标签不被任何别的标签包裹 那他就是根标签(最外层)
    使用场景:
    1.配置文件
    2.常规的数据交换 例如从服务器获取一段新闻

    与json的区别:
    作用是一样的 都是一种数据格式
    xml比json先诞生
    json的数据比xml小
    目前json是主流

    python中的xml处理
    使用到的模块
    ElmentTree 表示整个文件的元素树

    Elment 表示一个节点
    属性
    1.text 开始标签和结束标签中间的文本
    2.attrib 所有的属性 字典类型
    3.tag 标签的名字
    方法
    get 获取某个属性的值
    1.解析XML
    查找标签
    find 在子标签中获取名字匹配第一个
    findall 在子标签中获取名字匹配的所有标签
    iter(tagname) 在全文中查找[匹配的所有标签 返回一个迭代器
    2.生成XML
    用ElmentTree
    parse() 解析一个文件
    getroot() 获取根标签
    write() 写入到文件
    3.修改xml
    set 一个属性
    remove 一个标签
    append 一个标签
    '''

    import xml.etree.ElementTree as ElementTree
    # 解析d.xml-egon
    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)


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

    # 写入文件
    # tree.write("f.xml",encoding="utf-8")

    """
    用代码生成一个xml文档


    import xml.etree.ElementTree as et
    # 创建根标签
    root = et.Element("root")
    # 创建节点树
    t1 = et.ElementTree(root)

    # 加一个peron标签
    persson = et.Element("person")
    persson.attrib["name"] = "yyh"
    persson.attrib["sex"] = "man"
    persson.attrib["age"] = "20"
    persson.text = "这是一个person标签"

    root.append(persson)

    # 写入文件
    t1.write("newXML.xml",encoding="utf-8",xml_declaration=True)
    """

    # ===============================
    '''
    configparser
    configparser 是什么? 配置文件解析模块
    什么是配置文件?
    用于提供程序运行所需要的一些信息的文件 后缀 ini cfg
    配置信息 通常是 需要更改但是不需要经常改的值
    有什么用?
    方便用户修改 例如超时时间

    配置文件内容格式
    只包括两种元素
    section 分区
    option 选项
    一个文件可以有多个section
    一个section可以有多个选项

    核心功能
    1.sections 获取所有分区
    2.options 获取所有选项
    3.get 获取一个值 传入 section option

    注意:大小写不敏感

    常用功能:
    read 读取一个配置文件
    write 写入到文件中
    get 获取某个分区下 某个选项的值

    set 修改 或增加选项
    remove_section 删除分区
    remove_option 删除选项
    add_section 添加分区
    '''
    # 假装做一个下载功能 最大链接速度可以由用户来控制 用户不会看代码 所以提供一个配置文件
    import configparser
    # 得到配置文件对象
    cfg = configparser.ConfigParser()
    # 读取一个配置文件
    cfg.read("download.ini")

    # 获取需要的信息
    # 获取所有分区
    # print(cfg.sections())
    # 获取所有选项
    # print(cfg.options("section1"))

    # 获取某个选项的值
    # print(type(cfg.get("section1","maxspeed")))
    # get返回的都是字符串类型
    # 如果需要转换类型 直接使用get+对应的类型(bool int float)
    # print(type(cfg.getint("section1","maxspeed")))
    # print(cfg.getint("section2","minspeed"))

    # 是否由某个选项
    # config.has_option()
    # 是否由某个分区
    # config.has_section()

    # 不太常用的
    # 添加
    # 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)




  • 相关阅读:
    【逆序对相关/数学】【P1966】【NOIP2013D1T2】 火柴排队
    【贪心/DP/单调队列】【CF1029B】Creating the Contest
    【二分】【P1314】 【NOIP2011D2T2】聪明的质监员
    【树形DP】【P1351】 【NOIP2014D1T2】联合权值
    【枚举】 最大子矩阵(I)
    【单调队列】【P2627】 修剪草坪
    【矩阵】矩阵初级
    【计数】【UVA11401】 Triangle Counting
    【计数原理】【UVA11538】 Chess Queen
    【状压DP】【UVA11795】 Mega Man's Mission
  • 原文地址:https://www.cnblogs.com/du-jun/p/9812858.html
Copyright © 2011-2022 走看看