@[TOC](Python读写xml(xml,lxml)Edge 浏览器插件 WebTab - 免费ChatGPT)
XML 一、xml文件创建 方法一:使用xml.dom.minidom 1、文件、标签的创建 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 import xml.etree.ElementTree as etreefrom xml.dom.minidom import Documentfrom xml.etree.ElementTree import Element as El doc = Document() root_node = doc.createElement("root" ) doc.appendChild(root_node) son_node = doc.createElement("son_node" ) root_node.appendChild(son_node) text = doc.createTextNode("标签内容" ) son_node.appendChild(text) son_node.setAttribute("name" , "value" ) son_node.setAttribute("name1" , "value1" ) sec_node = doc.createElement("second" ) son_node.appendChild(sec_node) text = doc.createTextNode("二级子节点内容" ) sec_node.appendChild(text) filename = "test.xml" f = open (filename, "w" , encoding="utf-8" ) f.write(doc.toprettyxml(indent=" " )) f.close()
输出
1 2 3 4 5 6 7 <?xml version="1.0" ?> <root > <son_node name ="value" name1 ="value1" > 标签内容 <second > 二级子节点内容</second > </son_node > </root >
方法二:使用ElementTree 1 2 3 4 5 6 7 8 9 10 11 12 13 import xml.etree.ElementTree as etree root = etree.Element("root" ) son = etree.SubElement(root, "max" , attrib={"sex" : "male" }) son.text = "content" sub_son = etree.SubElement(son, "lily" , attrib={"sex" : "female" }) et = etree.ElementTree(element=root) et.write(r"test.xml" , encoding="utf-8" )
输出
1 <root > <max sex ="male" > content<lily sex ="female" /> </max > </root >
二、xml文件修改 1、修改标签内容,属性 1 2 3 4 5 6 tag.text = "modify_content" tag.set ("atrri" , "value3" ) tag.attrib = {"atrri" : "value" }
2、增加子标签 1 2 3 4 5 6 7 tag = root.find(".//name" ) sex = etree.SubElement(tag, "sex" , attrib={"hobby" : "swim" }) sex.text = "male" addr = etree.SubElement(tag, "address" , attrib={"provience" : "guangdong" }) addr.text = "shenzhen" tree.write(xml_path)
四、xml操作之删除 1、删除指定标签 1 2 3 4 5 6 7 8 9 10 xml_path = r"test.xml" tree = etree.parse(xml_path) for t in tree.iter (): if t.tag == "entry" : print (list (t)) for i in list (t): if i.tag == "category" : t.remove(i) break tree.write(xml_path)
3、删除xml文件 1 2 xml_path = r"test.xml" os.remove(xml_path)
LXML lxml解析xml的时候,自动处理各种编码问题。而且它天生支持 XPath 1.0、XSLT 1.0、定制元素类。
1、读取xml文档 1)文档解析 lxml可以解析xml的字符串,使用etree.fromstring方法,如下所示:
1 2 3 4 5 from lxml import etree xml_text = '<xml><head></head><body></body></xml>' xml = etree.fromstring(xml_text)
lxml可以直接读取xml文件。
示例test.xml:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 <?xml version="1.0" encoding="utf-8" ?> <root version ="1.2" tag ="test" > <head > <title > test xml document</title > </head > <body > <items id ="1" > <source > aa</source > <target > AA</target > </items > <items id ="2" > <source > bb</source > <target > BB</target > </items > <items id ="3" > <source > cc</source > <target id ="3t" > CC<bpt id ="3t1" /> cc</target > </items > </body > </root >
lxml读取xml文件的代码如下所示:
1 2 3 4 from lxml import etree xml = etree.parse('test.xml' )
2)获取属性 根节点root中有两个属性,我们可以通过如下方法获取根节点和其属性:
1 2 3 4 5 6 7 8 9 10 from lxml import etree xml = etree.parse('test.xml' ) root = xml.getroot() print (root.items()) print (root.keys()) print (root.get('version' , '' ))
得到如下结果:
1 2 3 [('version', '1.0'), ('tag', 'test')] ['version', 'tag'] 1.2
3)获取节点 假如我们不知道root节点下有什么节点,可以通过循环遍历。
1 2 for node in root.getchildren(): print (node.tag)
得到如下结果:
4)获取文本 有些元素中有文本,这个可以通过text属性获取。
1 2 3 for node in root.xpath('//source' ): print (node.text)
2、写入xml文档 1)创建文档(节点) 对于lxml来说,任意节点都可以保存成一个xml文档。
我们只需要给该节点加入属性、内容、子节点等等即可。
那么创建节点方法如下:
1 2 3 4 5 from lxml import etree root = etree.Element('root' )
在创建节点的同时,也可以给该节点加入命名空间:
1 root = etree.Element('root' , nsmap={'xmlns' :'http://www.w3.org/1999/xhtml' })
在上面的test.xml中,还有两组属性。可用set方法添加属性:
1 2 root.set ('version' , '1.2' ) root.set ('tag' , 'test' )
当然,也可以在创建节点的时候,就写入属性:
1 2 attribs = {'version' :'1.2' , 'tag' :'test' } root = etree.Element('root' , attrib=attribs)
2)添加子节点 添加根节点之后,根节点下有两个子节点:head和body。
添加子节点有两种方法,先看方法1:
1 2 head = etree.Element('head' ) root.append(head)
该方法是创建节点,再用append方法追加到root节点中。
还有一种方法,直接创建子节点:
1 head = etree.SubElement(root, 'head' )
推荐使用第2种方法,比较快捷。
若需要写属性值,除了用set方法。etree.SubElement方法也可以像etree.Element方法一样直接写入属性。
1 head = etree.SubElement(root, 'head' , attrib={'id' :'head_id' })
3)添加文本 test.xml文档中,有几个地方需要添加文本。先给head添加title属性,并加入文本:
1 2 title = etree.SubElement(head, 'title' ) title.text = 'test xml document'
直接给text赋值即可。
4)保存文档 文档写好之后,就保存文档。保存文档这里有两种方法。
一种为通过etree.tostring方法得到xml的文本,再手动写入。这个方法过于麻烦,就不讲了,也不推荐。
常规方法是通过etree的tree对象保存文件。代码如下:
1 2 3 tree = etree.ElementTree(root) tree.write('test.xml' , pretty_print=True , xml_declaration=True , encoding='utf-8' , with_comments=True )
各个参数含义如下:
第1个参数是xml的完整路径(包括文件名);
pretty_print参数是否美化代码;
xml_declaration参数是否写入xml声明,就是我们看到xml文档第1行文字;
encoding参数很明显是保存的编码;
with_comments参数是否保留注释。
当你使用Python处理XML文件并且对注释进行修改时,你需要使用一个支持XML注释的XML解析器库。例如,使用Python内置的xml.etree.ElementTree来解析XML文档时,它是不会保留注释的,并且属性的顺序可能也会发生改变。但是,你可以使用第三方库lxml来处理XML文件并保留注释。
1 2 3 4 5 6 7 8 9 10 11 from lxml import etree doc = etree.parse('example.xml' ) comment_node = doc.xpath('//comment()' )[0 ] comment_node.text = 'New comment' doc.write('example.xml' , encoding='utf-8' , xml_declaration=True , pretty_print=True , with_comments=True )
在代码中,我们使用etree.parse方法解析XML文件,然后通过doc.xpath方法获取注释节点并进行修改。最后使用doc.write方法保存修改后的XML文件,确保传递参数with_comments=True以保留注释。
3、读取xml文件变成字符串和通过字符串生成xml文件 1 2 3 4 5 6 7 8 9 10 11 12 from lxml import etreedef read_xml_file (file_path ): with open (file_path, 'r' , encoding='utf-8' ) as file: xml_string = file.read() return xml_string template = read_xml_file('info.xml' ) root = etree.fromstring(template)with open ('./qzk.xml' , 'wb' ) as file: file.write(etree.tostring(root, pretty_print=True ))
Edge 浏览器插件 WebTab - 免费ChatGPT
视频逐帧保存图片 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 import cv2import os path = r"***.mp4" path_dir=r"pictures" def get_frames (): cap = cv2.VideoCapture(path) if not cap.isOpened(): print ("Error opening video stream or file" ) frame_count = 0 while cap.isOpened(): ret, frame = cap.read() if ret: cv2.imwrite(os.path.join(path_dir,f"frame_{frame_count} .jpg" ), frame) frame_count += 1 else : break cap.release() cv2.destroyAllWindows()if __name__ == "__main__" : get_frames()