zoukankan      html  css  js  c++  java
  • python(32)——【shelve模块】【xml模块】

    一、 shelve模块

    • json和pickle模块的序列化和反序列化处理,他们有一个不足是在python 3中不能多次dump和load,shelve模块则可以规避这个问题。
    • shelve模块是一个简单的key,values将内存数据通过文件持久化的模块,可以持久化任何pickle可支持的python数据格式,是pickle 更上一层的封装。
    • shelve模块比pickle模块简单,只有一个open函数,返回类似字典的对象
    • 可读可写
    • key必须为字符串,而值可以是python所支持的数据类型

    #持久化储存

    import shelve
    f = shelve.open('shelve_test')
    f['stu1_info'] = {'name': 'alex', 'age': '18'}
    f['stu2_info'] = {'name': 'xxxx', 'age': '19'}
    f['stu3_info'] = {'name': 'rrrr', 'age': '17'}
    f.close()
    #直接对文件句柄[key]操作,就可以存入数据
    #且重要的是它还会直接在打开的当前目录生成三个文件:
    shelve_test.bak
    shelve_test.dat
    shelve_test.dir
    
    其中shelve_test.dat 存储的就是b字节数据类型的数据,
    bak和dir后缀的就可能是和数据库相关的设计缓存之类的东西了。
    注:文件生成后,我们可以将前面的这一段生成shelve_test的代码先行注释掉,不影响下面的继续测试操作。

    #解析文件内容

    import shelve
    f = shelve.open('shelve_test')
    data = f['stu1_info']
    f.close()
    print(type(data), data)
    
    #执行结果:
    <class 'dict'> {'name': 'alex', 'age': '18'}
    #通过get来解析文件内容
    import shelve
    f = shelve.open('shelve_test')
    date = f.get('stu1_info')['age']
    f.close()
    print(date)
    
    #执行结果:
    18

    二、xml模块

    • xml,可扩展标记语言,用来传输和储存数据
    • xml是实现不同语言或程序之间进行数据交换的协议,跟json差不多,但json使用起来更简单

    1. xml的格式如下,是通过<>节点来区别数据结构

    (xml数据:标签语言(文档树)

    <data>
        <country name="Singapore">
            <rank updated="yes">5</rank>
            <year updated="yes">2013</year>
            <gdppc>59900</gdppc>
            <neighbor direction="N" name="Malaysia" />
        </country>
        <country name="China">
            <rank updated="yes">1</rank>
            <year updated="yes">2016</year>
            <gdppc>1051100</gdppc>
            <neighbor direction="E" name="Korea" />
            <neighbor direction="W" name="Japan" />
        </country>
    </data>

    2. xml中节点Element类的函数

    tag                   当前节点标签名
    attrib                当前节点属性
    text                  当前节点内容
    append                添加一个子节点
    clear                 清空节点
    extend                为当前节点添加 n 个子节点
    find                  获取第一个寻找到的子节点
    findall               获取所有的子节点
    findtext              获取第一个寻找到的子节点的内容
    get                   获取当前节点的属性
    insert                在当前节点创建子节点,然后插入指定位置
    items                 获取当前节点的所有属性,和字典中的items一样,内容都是健值对
    iter                  在根据节点名称寻找所有指定的节点,并返回一个迭代器
    iterfind              获取所有指定的节点,并放在一个迭代器中
    itertext              在子孙中根据节点名称寻找所有指定的节点的内容,并返回一个迭代器
    keys                  获取当前节点的所有属性的 key
    makeelement           创建一个新节点
    remove                删除某个节点
    set                   设置当前节点属性


    3. xml解析(针对1中的xml文件进行操作)

    #ElementTree.parse("file_path")函数
    import xml.etree.ElementTree as ET
    tree = ET.parse('output')    #打开xml文件并且解析,返回一个xml.etree.ElementTree.ElementTree对象
    root = tree.getroot()    #获取xml的根节点
    print(root.tag)        #调用tag属性
    
    #执行结果:data
    import xml.etree.ElementTree as ET
    tree = ET.parse('output')
    root = tree.getroot()
    for i in root:        #对根节点进行遍历,遍历结果是地址,即其子对象,调用其tag属性
        print(i.tag)
    
    #执行结果:
    country
    country
    country
    #对第三级子节点进行遍历,并调用其tag属性
    import xml.etree.ElementTree as ET
    tree = ET.parse('output')
    root = tree.getroot()
    for i in root:
        for j in i:
            print(j.tag)

    #执行结果:

    rank
    year
    gdppc
    neighbor
    neighbor
    rank
    year
    gdppc
    neighbor
    rank
    year
    gdppc
    neighbor
    neighbor
    View Code
    #调用attrib属性(打印标签对应的属性内容)
    import xml.etree.ElementTree as ET
    tree = ET.parse('output')
    root = tree.getroot()
    for i in root:
        print(i.attrib)
    
    #执行结果:
    {'name': 'Liechtenstein'}
    {'name': 'Singapore'}
    {'name': 'China'}    
    #调用text属性(打印标签包裹的内容)
    import xml.etree.ElementTree as ET
    tree = ET.parse('output')
    root = tree.getroot()
    for i in root:
        for j in i:
            print(j.text)

    #执行结果:

    #执行结果:
    21
    2010
    141100
    None
    None
    5
    2013
    59900
    None
    1
    2016
    1051100
    None
    None
    View Code
    #只遍历某一节点
    import xml.etree.ElementTree as ET
    tree = ET.parse('output')
    root = tree.getroot()
    for note in root.iter("rank"):
        print(note.tag,note.attrib,note.text)
        
    #执行结果:
    rank {'updated': 'yes'} 21
    rank {'updated': 'yes'} 5
    rank {'updated': 'yes'} 1
    #删除某一节点(删除排名大于20的城市的所有内容)
    import xml.etree.ElementTree as ET
    tree = ET.parse('output')
    root = tree.getroot()
    for country in root.findall('country'):
        rank = int(country.find('rank').text)
        if rank > 20:
            root.remove(country)
    tree.write('output')        #操作完记得进行写操作

    4. 创建XML数据

    思路:创建一个根节点标签,插入多个子节点,创建完之后要生成文档树

    import xml.etree.ElementTree as ET
    
    new_xml = ET.Element('namelist')
    
    name = ET.SubElement(new_xml, 'name',attrib={'enrolled':'yes'})
    age = ET.SubElement(name, 'age', attrib={'checked':'no'})
    sex =ET.SubElement(name, 'sex')
    sex.text = 'female'
    
    name2 = ET.SubElement(new_xml, 'name',attrib={'enrolled':'yes'})
    age = ET.SubElement(name2, 'age')
    sex =ET.SubElement(name2, 'sex')
    age.text = '16'
    
    et = ET.ElementTree(new_xml)        #生成文档对象
    et.write('test.xml', encoding = 'utf-8', xml_declaration=True)
    ET.dump(new_xml)        #打印生成格式
    
    #执行结果:(没有缩进)
    <namelist><name enrolled="yes"><age checked="no" /><sex>female</sex></name><name enrolled="yes"><age>16</age><sex /></name></namelist>


    5. 增加缩进

    import xml.etree.ElementTree as ET
    from xml.dom import minidom
    
    def prettify(elem):
        """
        将节点转换成字符串,并添加缩进
        """
        #返回该对象的字符串表示
        rough_string = ET.tostring(elem, 'utf-8')
        print(type(rough_string))
        #从xml字符串得到dom对象
        reparsed = minidom.parseString(rough_string)
        print(type(reparsed))
        return reparsed.toprettyxml(indent="	")
    
    new_xml = ET.Element('namelist')
    
    name = ET.SubElement(new_xml, 'name',attrib={'enrolled':'yes'})
    age = ET.SubElement(name, 'age', attrib={'checked':'no'})
    sex =ET.SubElement(name, 'sex')
    sex.text = 'female'
    
    name2 = ET.SubElement(new_xml, 'name',attrib={'enrolled':'yes'})
    age = ET.SubElement(name2, 'age')
    sex =ET.SubElement(name2, 'sex')
    age.text = '16'
    
    newStr=prettify(new_xml)
    
    file = open('test.xml', 'w',encoding = 'utf-8')
    file.write(newStr)
    file.close()
    ET.dump(new_xml)
  • 相关阅读:
    进制间转换的理论和实现不同
    操作DOM
    浏览器对象
    浏览器
    面向对象编程——class继承
    面向对象编程——原型继承
    js面向对象编程——创建对象
    JS面向对象编程
    js的JSON
    js标准对象——Date
  • 原文地址:https://www.cnblogs.com/guoruxin/p/10515565.html
Copyright © 2011-2022 走看看