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

浙公网安备 33010602011771号