• Python学习笔记(4)


    Python 解析 XML文件

    python 中使用 xml.dom.minidom模块来解析XML文件, xml.dom.minidom.parse() 用于打开一个XML文件,并将这个文件对象转为xmldom变量。

    xmldom.documentElement 用于得到dom对象的根节点,并把获得的对象给root ,每一个节点都有它的 nodeName 、 nodeValue 、 nodeType 属性,  nodeName 为节点名字, nodeValue 是节点的值(只对文本节点有效), nodeType 是节点的类型, nodeType 的12种类型:

    #encoding = utf-8
    import xml.dom.minidom
    
    # 打开一个XML文件
    xmlcode = xml.dom.minidom.parse('dome.xml')
    print(xmlcode)
    # 获取XML文件的根节点
    root = xmlcode.documentElement
    # 获取节点的名字
    print(root.nodeName)
    print(root.nodeValue)
    print(root.nodeType)
    # 获得节点下的所有子节点  包括换行节点
    print(root.childNodes)
    # 获得根节点下的 stydent 子节点
    stunodes = root.getElementsByTagName('student')
    print(stunodes)
    for n in stunodes:
      if stunodes.getAttribute('id') == 1:
        # 修改节点内容
        n.getElementsByTagName('name')[0].firstChild.data = '新内容'
        break
    # 判断属性是否存在
    print(root.hasAttribute('id'))
    # 获取属性
    print(root.getAttribute('id'))
    # 设置属性
    root.setAttribute('id', 12)
    # 创建一个新的节点 并添加到根节点下
    newElemt = xmlcode.createElement('new')
    newElemt.setAttribute('id', 13)
    root.appendChild(newElemt)
    # 把更改后的DOM对象写入文件
    xmlFile = open('dome.xml', mode="w", encoding="utf-8")
    xmlFile.write(xmlcode.toprettyxml())

    在python 中使用 SAX 解析 XML

    SAX是一种基于事件驱动的API , 通常包含三个事件: 开始解析标签事件、解析数据事件、结束解析标签事件

    利用 SAX 解析 XML 文档涉及两个部分:解析器和事件处理器。解析器负责读取XML文档,并向事件处理器发送事件,如元素开始和元素结束事件。而事件处理器则负责对事件作出相应数据进行处理。

    SAX解析XML适用场景:  1、对大型文件进行处理;  2、只需要文件的部分内容,或者只需从文件中得到特定信息。

    #encoding=utf-8
    
    #导入相关模块
    import xml.sax
    import xml.sax.handler
    
    # 定义一个类,并继承 xml.sax.ContentHandler
    class studentHander(xml.sax.ContentHandler):
      def __init__ (self):
        print('开始解析')
    
      #开始解析文档
      def startDocument(self):
        print('开始解析文档')
    
      #结束文档解析
      def endDocument(self):
        print('结束文档解析')
    
      # 开始解析某个标签
      def startElement(self, name, attrs):
        print('{0}标签开始解析'.format(name))
        if name == 'movie':
          print('该标签的属性值为{0}'.format(attrs['title']))
    
      # 结束解析某个标签
      def endElement(self, name):
        print('{0}标签结束解析'.format(name))
    
      # 解析过程,获得解析得到的值
      def characters(self, content):
        print('解析过程,获得解析得到的值为{0}'.format(content))
    
    # 创建一个新的解析器对象并返回
    parser = xml.sax.make_parser()
    
    # 指定解析器的ContentHandler对象
    parser.setContentHandler(studentHander())
    
    # 解析XML文件
    parser.parse("dome.xml")

    多线程

    运行中的程序,称为进程;一个程序对应一个进程,一个进程可包含多个线程。

    线程,有时被称为轻量级进程,是程序执行流的最小单位。一个线程可以创建和撤销另一个线程,同一个进程中的多个线程之间可以并发执行。

    线程有就绪、阻塞、运行三种基本状态。

    python 通过两个标准库 _thread 和 threading 提供对线程的支持。_thread 提供了低级别的、原始的线程以及一个简单的锁。相对于 threading 模块功能有限。

    threading 模块包含了 _thread模块所有的方法,还提供其他的方法:

    threading.currentThread() :  返回当前的线程变量

    threading.enumerate():     返回一个包含正在运行的线程的list 。正在运行指线程启动后、结束前。不包括启动前和终止后的线程。

    threading.activeCount() :  返回正在运行的线程数量,相对于 len(threading.enumerate())

    除了threading模块的方法外,线程模块同样提供了 Thread 类来处理线程, Thread 类提供了以下方法:

    run()  :           用来表示线程活动

    start()  :         启动线程活动

    join([time]):  等待至线程终止,这阻塞调用线程直至线程的join() 方法被调用终止,正常退出或者抛出未处理的异常或者是可选的超时发生

    isAlive()  :      返回线程是否活动

    getName()  :  返回线程名

    setName() : 设置线程名

    #encoding=utf-8
    import threading
    # 获得当前的线程对象
    currentThread = threading.currentThread()
    # 线程是否正在运行
    print(currentThread.isAlive())
    # 线程名字
    print(currentThread.getName())
    # 是否为后台线程
    print(currentThread.isDaemon())
    # 正在运行的线程数量
    print(threading.activeCount())
    # 正在运行的所有线程列表
    print(threading.enumerate())

    使用函数创建多线程:

    #encoding=utf-8
    import time
    import _thread
    def showTime(name, delayTime):
      count = 1
      while count <=6:
        time.sleep(delayTime)
        count = count + 1
        print('执行体的名字{0},当前时间{1}'.format(name, time.ctime(time.time())))
    
    # 依次执行各个方法,需要耗费长时间
    # showTime('cs1', 2)
    # showTime('cs2', 2)
    # showTime('cs3', 2)
    # showTime('cs4', 2)
    
    # 使用函数创建多线程
    try:
      # 开启设置多个线程
      _thread.start_new_thread(showTime, ('cs1', 2))
      _thread.start_new_thread(showTime, ('cs2', 2))
      _thread.start_new_thread(showTime, ('cs3', 2))
      _thread.start_new_thread(showTime, ('cs4', 2))
      print('设置完毕')
    except:
      print('error')
    finally:
      while True:
        pass

    使用类来创建多线程:

    #encoding=utf-8
    import time
    import threading
    def showTime(name, delayTime):
      count = 1
      while count <=6:
        time.sleep(delayTime)
        count = count + 1
        print('执行体的名字{0},当前时间{1}'.format(name, time.ctime(time.time())))
    
    # 依次执行各个方法,需要耗费长时间
    # showTime('cs1', 2)
    # showTime('cs2', 2)
    # showTime('cs3', 2)
    # showTime('cs4', 2)
    
    # 使用类来创建多线程
    class myThread(threading.Thread):
      def __init__(self, name, delayTime):
        threading.Thread.__init__(self)    # 重点
        self.name = name
        self.delayTime = delayTime
      
      # 定义多线程执行逻辑,通过 start方法触发
      def run(self):
        print('{0}多线程开始执行'.format(self.name))
        showTime(self.name, self.delayTime)
    
    myThread1 = myThread('cs1', 2)
    myThread2 = myThread('cs2', 2)
    myThread3 = myThread('cs3', 2)
    myThread4 = myThread('cs4', 2)
    
    myThread1.start()   # 调用 start 方法, 会自动调用类里面的 run 方法
    myThread2.start()
    myThread3.start()
    myThread4.start()

    多线程的同步:

    #encoding=utf-8
    import threading
    import time
    
    count = 2
    # 获得 lock对象,锁,用于多线程的同步
    lock = threading.Lock()
    
    class saleTick(threading.Thread):
      def __init__(self, name):
        threading.Thread.__init__(self)
        self.name = name
    
      def run(self):
        global count, lock
        # 进行锁定,此时其他线程该部分进入阻塞状态,会等该部分解锁后继续执行,用于保持数据的同步
        lock.acquire()
        if count >= 1:
          time.sleep(2)
          count = count - 1
          print('买到票,余票{0}'.format(count))
        else:
          print('没抢到票')
        # 进行解锁,其他线程可使用
        lock.release()
    
    
    
    thread1 = saleTick('p1')
    thread2 = saleTick('p2')
    thread3 = saleTick('p3')
    thread4 = saleTick('p4')
    
    thread1.start()
    thread2.start()
    thread3.start()
    thread4.start()

    装饰器

    装饰器是把一个函数作为参数的函数,常常用于扩展已有函数,即不改变当前函数状态下增加功能。 通常使用 @名称 标记

    import time
    
    # 定义一个装饰器
    def countTime(f):
      def wrapper(*args, **kwargs):   # 传入参数,表示可有可无
        begin = time.time()
        f(*args, **kwargs)      # 这里代表的是使用装饰器的函数逻辑
        end = time.time()
        print(end - begin)
      return wrapper
    
    @countTime
    def test():
      for n in range(100):
        for t in range(100):
          pass
    
    
    test()

    单例模式

    一个类自始至终只产生一个实例对象,称为单例模式。

    单例模式三个要点:1、某个类只能有一个实例 ; 2、 它必须自行创建这个实例;  3、它必须自行向整个系统提供这个实例;

    #encoding=utf-8
    
    # 创建单例模式类
    class Singleton(object):      # object 是所有类的父类
      # 定义一个变量存储实例对象
      _singletObject = None
      # 构造方法
      def __init__(self, *args, **kwargs):
        object.__init__(self, *args, **kwargs)
      # 初始化方法
      def __new__(cls, *args, **kwargs):
        if Singleton._singletObject is None:     # 如果当前没有实例对象
          Singleton._singletObject = object.__new__(cls)    #创建一个实例对象并存储
        return Singleton._singletObject               # 存在实例对象,直接将其返回
          
    
    # 创建一个类,继承单例模式
    class Myclass(Singleton):
      def __init__(self, name):
        Singleton.__init__(self)   # 调用父类的构造方法
        self.name = name
    
    # 这里创建的都是同个实例对象
    a = Myclass('a')
    b= Myclass('b')
    
    print(a.name)    # b
    print(b.name)    # b
    不积跬步,无以至千里;不积小流,无以成江海。
  • 相关阅读:
    JS提取子字符串函数比较
    js事件定义方式和获取事件对象event总结
    让body的clientHeight与html的clientHeight相等的方法
    关于原型链和继承问题的思考:为什么不能直接把父类的prototype赋值给子类的prototype
    [javascript权威指南笔记02]Throw语句和异常处理机制try/catch/finally
    转载:javascript语句标签
    转:JS中强大的正则表达式
    分享我常用的Javascript工具函数
    对prototype,instanceof和constrctor的理解
    xml基础知识总结和回顾
  • 原文地址:https://www.cnblogs.com/xuezhimin-esage-2020/p/14307716.html
Copyright © 2020-2023  润新知