• Python学习第二阶段Day2(json/pickle)、 shelve、xml、PyYAML、configparser、hashlib模块


    1.json/pickle   略。

    2.shelve模块

    import shelve
    
    # shelve 以key value的形式序列化,value为对象
    class Foo(object):
        def __init__(self, n):
            self.n = n
    s = shelve.open("shelve_test")
    name = ["alex", "rain", "test"]
    s["test"] = name
    s["a"] = Foo(1)
    s["b"] = Foo(2)
    
    
    # 反序列化,提取对象
    
    print(s.items())        # 提取所有
    print(s.get("test"))    # 提取单个
    
    s.close()

     3.xml的处理

    xml文件:country.xml

    <?xml version="1.0"?>
    <data>
        <country name="Liechtenstein">
            <rank updated="yes">2</rank>
            <year>2008</year>
            <gdppc>141100</gdppc>
            <neighbor name="Austria" direction="E"/>
            <neighbor name="Switzerland" direction="W"/>
        </country>
        <country name="Singapore">
            <rank updated="yes">5</rank>
            <year>2011</year>
            <gdppc>59900</gdppc>
            <neighbor name="Malaysia" direction="N"/>
        </country>
        <country name="Panama">
            <rank updated="yes">69</rank>
            <year>2011</year>
            <gdppc>13600</gdppc>
            <neighbor name="Costa Rica" direction="W"/>
            <neighbor name="Colombia" direction="E"/>
        </country>
    </data>
    View Code

    遍历等处理:

    import xml.etree.ElementTree as ET
    
    tree = ET.parse("country.xml")
    root = tree.getroot()   # data 根节点

    ''' 一般的节点<tag attrib="value"> text <tag/> 自结束标签<tag attrib="value"/> ''' # 遍历xml文档 for child in root: print(child.tag, child.attrib) for i in child: print(i.tag, i.text) # 只遍历year 节点 for node in root.iter('year'): print(node.tag, node.text)

     修改和删除:

    import xml.etree.ElementTree as ET
    
    tree = ET.parse("country.xml")
    root = tree.getroot()
    
    # 修改
    for node in root.iter('year'):
        new_year = int(node.text) + 1
        node.text = str(new_year)
        node.set("updated", "yes")
    
    tree.write("country.xml")
    
    # 删除node
    for country in root.findall('country'):  # 或者root.iter('country')
        rank = int(country.find('rank').text)
        if rank > 50:
            root.remove(country)
    
    tree.write('country.xml')

    生成xml文件:

    import xml.etree.ElementTree as ET
    
    new_xml = ET.Element("infolist")
    info = ET.SubElement(new_xml, "info", attrib={"enrolled": "yes"})
    name = ET.SubElement(info, "name")
    name.text = 'akira'
    age = ET.SubElement(info, "age", attrib={"checked": "no"})
    age.text = '33'
    sex = ET.SubElement(info, "sex")
    sex.text = 'F'
    
    info1 = ET.SubElement(new_xml, "info", attrib={"enrolled": "yes"})
    name1 = ET.SubElement(info1, "name")
    name1.text = 'alen'
    age1 = ET.SubElement(info1, "age", attrib={"checked": "no"})
    age1.text = '22'
    sex1 = ET.SubElement(info1, "sex")
    sex1.text = 'M'
    
    et = ET.ElementTree(new_xml)  # 生成文档对象
    et.write("test.xml", encoding="utf-8", xml_declaration=True)  
                                        # <?xml version='1.0' encoding='utf-8'?>
    ET.dump(new_xml)  # 打印生成的格
    View Code

    生成的xml内容:

    <?xml version='1.0' encoding='utf-8'?>
    <infolist>
        <info enrolled="yes">
            <name>akira</name>
            <age checked="no">33</age>
            <sex>F</sex>
        </info>
        <info enrolled="yes">
            <name>alen</name>
            <age checked="no">22</age>
            <sex>M</sex>
        </info>
    </infolist>
    View Code

     4.YAML

    Python也可以很容易的处理ymal文档格式,只不过需要安装一个模块,参考文档:http://pyyaml.org/wiki/PyYAMLDocumentation 

    例如下面的格式

    /etc/http/conf/http.conf:
      file.managed:
        - source: salt://apache/http.conf
        - user: root
        - group: root
        - mode: 644
        - template: jinja
        - defaults:
            custom_var: "default value"
            other_var: 123
    View Code

    5.configparser

    修改配置文件的,格式:

    [DEFAULT]
    ServerAliveInterval = 45
    Compression = yes
    CompressionLevel = 9
    ForwardX11 = yes
     
    [bitbucket.org]
    User = hg
     
    [topsecret.server.com]
    Port = 50022
    ForwardX11 = no

    解析:(读取配置文件,并查询条目)

    import configparser
    
    conf = configparser.ConfigParser()
    conf.read("example.conf")
    print(conf.defaults())  # DEFAULT下的条目:
                            # ["ServerAliveInterval":45,"Compression","yes"...]
    print(conf.sections())  # 所有选项除DEFAULT:["bitbucket.org","topsecret.server.com"]
    
    print(conf["DEFAULT"]["ForwardX11"])  # DEFAULT选项中的"ForwardX11"的值
    print(conf["bitbucket.org"]["User"])
    print(conf["topsecret.server.com"]["Port"])
    
    for key in conf["DEFAULT"]:   # 遍历DEFAULT条目
        print(key, conf["DEFAULT"][key])

    写入:

    import configparser
    
    conf = configparser.ConfigParser()  # 创建配置文件对象
    conf.read("example.conf")           # 读取配置文件
    
    
    
    conf.write(open("filename.conf", "w"))  # 配置文件对象写入文件

    用Python生成这个文档:

    import configparser
     
    config = configparser.ConfigParser()
    config["DEFAULT"] = {'ServerAliveInterval': '45',
                          'Compression': 'yes',
                         'CompressionLevel': '9'}
     
    config['bitbucket.org'] = {}
    config['bitbucket.org']['User'] = 'hg'
    config['topsecret.server.com'] = {}
    topsecret = config['topsecret.server.com']
    topsecret['Host Port'] = '50022'     # mutates the parser
    topsecret['ForwardX11'] = 'no'  # same here
    config['DEFAULT']['ForwardX11'] = 'yes'
    with open('example.ini', 'w') as configfile:
       config.write(configfile)

    “增,删,改”:

    import ConfigParser
      
    config = ConfigParser.ConfigParser()
    config.read('i.cfg')
      
    # ########## 读 ##########
    #secs = config.sections()
    #print secs
    #options = config.options('group2')
    #print options
      
    #item_list = config.items('group2')
    #print item_list
      
    #val = config.get('group1','key')
    #val = config.getint('group1','key')
      
    # ########## 改写 ##########
    #sec = config.remove_section('group1')
    #config.write(open('i.cfg', "w"))
      
    #sec = config.has_section('wupeiqi')
    #sec = config.add_section('wupeiqi')
    #config.write(open('i.cfg', "w"))
      
      
    #config.set('group2','k1',11111)
    #config.write(open('i.cfg', "w"))
      
    #config.remove_option('group2','age')
    #config.write(open('i.cfg', "w"))

    6、hashlib

    加密相关操作,3.x里代替了md5和sha模块,提供 SHA1 , 224,256,384,512,MD5算法,MD5算法是hash散列表的一种实现,也是应用最广泛的一种

     hashlib,hash字符串转数字,字典就是用hash做的,字符串排序,存取速度快,

    网站防篡改报警功能,定时wget网站首页,如果文件没有变更,MD5值不变

    SHA1----MD5   越来越复杂,越来越安全,都是基于hash的

    hmac消息加密速度比较快

    中文需要 ("中文".encode(encoding="utf8"))    MD5的加密,其他SHA..一样的用法

    import hashlib
    
    #  先加hello, 再加world
    m = hashlib.md5()
    m.update("hello".encode("utf8"))
    print(type("hello".encode("utf8")))  # <class 'bytes'>
    m.update("world".encode("utf8"))
    print(m.digest())       # MD5 二进制表示b'xfc^x03x8d8xa5p2x08TAxe7xfepx10xb0'
    print(m.hexdigest())    # 十六进制表示fc5e038d38a57032085441e7fe7010b0
    
    # 直接helloworld
    m1 = hashlib.md5()
    m1.update("helloworld".encode("utf8"))
    print(m.digest())       # b'xfc^x03x8d8xa5p2x08TAxe7xfepx10xb0'
    print(m.hexdigest())    # fc5e038d38a57032085441e7fe7010b0

    还不够吊?python 还有一个 hmac 模块,它内部对我们创建 key 和 内容 再进行处理然后再加密

    散列消息鉴别码,简称HMAC,是一种基于消息鉴别码MAC(Message Authentication Code)的鉴别机制。使用HMAC时,消息通讯的双方,通过验证消息中加入的鉴别密钥K来鉴别消息的真伪;

    一般用于网络通信中消息加密,前提是双方先要约定好key,就像接头暗号一样,然后消息发送把用key把消息加密,接收方用key + 消息明文再加密,拿加密后的值 跟 发送者的相对比是否相等,这样就能验证消息的真实性,及发送者的合法性了。

    import hmac
    h = hmac.new('天王盖地虎'.encode("utf8"), '宝塔镇河妖'.encode("utf8"))
    print (h.hexdigest())
    View Code
  • 相关阅读:
    oracle 11g jdbc jar包在哪个文件目录
    Java生成验证码
    Oracle 安装“权限不够”
    Linux新建文件、文件夹
    基于Java web技术文件上传和下载功能开发实战练习视频(fileupload)
    springmvc的xml文件位置
    oracle 11g的OEM(企业管理器),https://主机ip:1158/em/console网页无法显示
    常见的开源协议分析
    约瑟夫问题猴子选大王
    TOJ1036.Rails STL栈
  • 原文地址:https://www.cnblogs.com/revo/p/7239548.html
Copyright © 2020-2023  润新知