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

 

复制代码
posted @   莫离m  阅读(137)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示