【Python--XML文件读写】XML文件读写详解

这篇具有很好参考价值的文章主要介绍了【Python--XML文件读写】XML文件读写详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【Python–XML文件读写】XML文件读写详解

1. 前言

1.1 介绍

XML 指可扩展标记语言XML ,常被设计用来传输和存储数据。

XML 是一种固有的分层数据格式,最自然的表示方式是使用树。 ET为此有两个类 - ElementTree将整个 XML 文档表示为一棵树,并 Element表示该树中的单个节点。与整个文档的交互(从文件读取和写入/从文件写入)通常在ElementTree级别上完成。与单个 XML 元素及其子元素的交互是在Element级别上完成的。

其内元素称作子节点通过 parse() 解析xml文本,返回根元素 tree。(一级节点Annotation) 通过对 tree 进行findall操作,可到到带有指定标签的节点(二级节点eg:filename,object)。

1.2 用法

xml.etree.ElementTree模块实现了用于解析和创建 XML 数据的简单高效的 API。 Element对象有以下常用属性:

  • tag: 标签
  • findall() : 只找到带有标签的 所有节点
  • append() : 增加新节点
  • set():增加或者修改属性
  • text: 去除标签,获得标签中的内容。
  • attrib: 获取标签中的属性和属性值。
  • remove():删除节点
  • 保存xml文件: ElementTree.write()

2. xml文件内容形式

python 读写xml,使用说明,python,xml,开发语言

3. xml文件读写

3.1 项目框架

python 读写xml,使用说明,python,xml,开发语言

3.1 写入操作(创建)(create_xml.py)

from xml.etree.ElementTree import Element
from xml.etree.ElementTree import SubElement
from xml.etree.ElementTree import ElementTree
from xml.dom import minidom

'''
生成对应的label, 也就是xml文件
'''

# 该函数使xml文件更加美观,也就是换行和缩进
def prettyXml(element, indent, newline, level = 0):
    '''
    参数:
    elemnt为传进来的Elment类;
    indent用于缩进;
    newline用于换行;
    '''
    # 判断element是否有子元素
    if element:
        # 如果element的text没有内容      
        if element.text == None or element.text.isspace():     
            element.text = newline + indent * (level + 1)      
        else:    
            element.text = newline + indent * (level + 1) + element.text.strip() + newline + indent * (level + 1)    
    # 此处两行如果把注释去掉,Element的text也会另起一行 
    #else:     
        #element.text = newline + indent * (level + 1) + element.text.strip() + newline + indent * level    
    temp = list(element) # 将elemnt转成list    
    for subelement in temp:    
        # 如果不是list的最后一个元素,说明下一个行是同级别元素的起始,缩进应一致
        if temp.index(subelement) < (len(temp) - 1):     
            subelement.tail = newline + indent * (level + 1)
        else:  # 如果是list的最后一个元素, 说明下一行是母元素的结束,缩进应该少一个    
            subelement.tail = newline + indent * level   
        # 对子元素进行递归操作 
        prettyXml(subelement, indent, newline, level = level + 1)


def create(root_dir, img_name, bg_size, count, tg_loca):
          '''
          root_dir: 要写到得文件夹下
          img_name: 对应样本的文件名
          bg_size: 图片的大小 (w, h)
          count: 目标的个数
          tg_loca: 裂缝目标的位置 list[(x_tl, y_tl, x_br, y_br)]
          '''
          # 1 annotation
          annotation = Element('annotation')
          
          # 1-1 filename
          filename = SubElement(annotation, 'filename')
          filename.text = img_name

          # 1-2 object_count
          object_count = SubElement(annotation, 'object_count')
          object_count.text = str(count)

          # 1-3 size
          # -------------------size start--------------------------
          size = SubElement(annotation, 'size')

          # 1-3-1 width
          width = SubElement(size, 'width')
          width.text = str(bg_size[0])

          # 1-3-2 height
          height = SubElement(size, 'height')
          height.text = str(bg_size[1])

          # 1-3-3 depth
          depth = SubElement(size, 'depth')
          depth.text = '1'
          # -------------------size end--------------------------

          # 1-4 segmented
          segmented = SubElement(annotation, 'segmented')
          segmented.text = '0'

          # 1-(5 : 5 + count) object
          for i in range(0, count):
                object = SubElement(annotation, 'object')
                # 1-(:)-1 name
                name = SubElement(object, 'name')
                name.text = 'Crack'

                # 1-(:)-2 pose
                pose = SubElement(object, 'pose')
                pose.text = 'Unspecified'

                # 1-(:)-3 truncated
                truncated = SubElement(object, 'truncated')
                truncated.text = str(i)

                # 1-(:)-4 difficult
                difficult = SubElement(object, 'difficult')
                difficult.text = '0'

                # 1-(:)-5 bndbox
                # ---------------------bndbox start------------------------------
                bndbox = SubElement(object, 'bndbox')
                # xmin
                xmin = SubElement(bndbox, 'xmin')
                xmin.text = str(tg_loca[i][0])
                # ymin
                ymin = SubElement(bndbox, 'ymin')
                ymin.text = str(tg_loca[i][1])
                # xmax
                xmax = SubElement(bndbox, 'xmax')
                xmax.text = str(tg_loca[i][2])
                # ymax
                ymax = SubElement(bndbox, 'ymax')
                ymax.text = str(tg_loca[i][3])
                # ---------------------bndbox end------------------------------
          
          tree = ElementTree(annotation)
          root = tree.getroot()  
          prettyXml(root, '\t', '\n')
          
          # write out xml data
          tree.write(root_dir + img_name + '.xml', encoding = 'utf-8')

root_dir = "./"
img_name = 'img.jpg'
bg_size = (1024, 1024)
count = 2
tg_loca = [(12, 12, 512, 512), (12, 513, 1000, 1000)]

create(root_dir, img_name, bg_size, count, tg_loca)
  • 得到的xml文件如下:
    python 读写xml,使用说明,python,xml,开发语言

3.2 读取操作(解析)(read_xml.py)

import xml.etree.ElementTree as ET
import os
from PIL import Image, ImageDraw, ImageFont

def parse_rec(pic_path, filename):
    """解析xml"""
    tree = ET.parse(filename)  # 解析读取xml函数
    objects = []
    coordinate = []
    for xml_name in tree.findall('filename'):
        img_path = os.path.join(pic_path, xml_name.text)
    for obj in tree.findall('object'):
        obj_struct = {'name': obj.find('name').text, 'pose': obj.find('pose').text,
                      'truncated': int(obj.find('truncated').text), 'difficult': int(obj.find('difficult').text)}
        bbox = obj.find('bndbox')
        obj_struct['bbox'] = [int(bbox.find('xmin').text),
                              int(bbox.find('ymin').text),
                              int(bbox.find('xmax').text),
                              int(bbox.find('ymax').text)]
        objects.append(obj_struct)
    for obj_one in objects:
        xmin = int(obj_one['bbox'][0])
        ymin = int(obj_one['bbox'][1])
        xmax = int(obj_one['bbox'][2])
        ymax = int(obj_one['bbox'][3])
        label = obj_one['name']
        coordinate.append([xmin,ymin,xmax,ymax,label])
    return coordinate, img_path
 
 
def visualise_gt(objects, img_path, now_path):
      img = Image.open(img_path)
      draw = ImageDraw.ImageDraw(img)
      for obj in objects:
          xmin = obj[0]
          ymin = obj[1]
          xmax = obj[2]
          ymax = obj[3]
          label = obj[4]
          draw.rectangle(((xmin, ymin), (xmax, ymax)), fill=None, outline="white")
          draw.text((xmin + 10, ymin), label, "blue")
          img.save(now_path)
 
 
if __name__ == "__main__":
    # 图片路径
    pic_path = "."

    # xml文件路径
    xml_path = "./img.jpg.xml"
    
    # 解析后存放地址
    now_path = "./img_now.jpg"
    # obj_context:返回一个含有所有标注的信息,img_dir:原始图片路径
    obj_context, img_path = parse_rec(pic_path, xml_path)
    visualise_gt(obj_context, img_path, now_path)
  • 原图:(img.jpg)
    python 读写xml,使用说明,python,xml,开发语言

  • 解析后的图:(img_now.jpg)
    python 读写xml,使用说明,python,xml,开发语言

4. 参考

【1】https://blog.csdn.net/qq_48764574/article/details/122052510文章来源地址https://www.toymoban.com/news/detail-766993.html

到了这里,关于【Python--XML文件读写】XML文件读写详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • QDomDocument Xml配置文件读写

    用Qt中QDomDocument读写Xml格式配置文件,使用时.pro文件中需加 .h文件 .cpp文件

    2024年02月09日
    浏览(33)
  • Python处理XML文件

    XML全称是Extensible Markup Language,中文名为可扩展标记语言。对xml的介绍可以看一下w3c的介绍。网络中数据传输的常见格式有json、xml、txt等。json很简单,xml稍微复杂,但是在python面前都不是事。 python有三种方式解析xml文档:SAX,DOM,以及 ElementTree(引自 菜鸟教程-Python XML解析

    2024年02月10日
    浏览(19)
  • Python操作XML文件一文通

    我们经常需要解析用不同语言编写的数据,Python 提供了许多第三方库来解析或拆分用其他语言编写的数据,今天我们来学习下 Python XML 解析器的相关功能。 下面一起来看看吧~ XML 是可扩展标记语言,它在外观上类似于 HTML,但 XML 用于数据表示,而 HTML 用于定义正在使用的数

    2024年01月19日
    浏览(26)
  • Qt读写ini配置文件(QSettings)、XML

    1、ini相关的 总结:Qt读写ini配置文件(QSettings) - 布丁Plus - 博客园 (cnblogs.com) Qt读写ini文件(含源码+注释)_qt ini文件读写_lw向北.的博客-CSDN博客 2、XML相关的 Qt读写XML文件(含源码+注释)_qt写xml_lw向北.的博客-CSDN博客

    2024年02月11日
    浏览(38)
  • Unity中的文件读写TXT 与XML

    在游戏开发中,有的单机游戏会用到保存数据到本地,或者根据本地的数据来进行下次的设置。这里,鄙人介绍TXT与xml 的读写。 首先是txt: 新建一个unity工程,创建一个cube,新建一个脚本:CreatTxt挂载到cube上。然后打开脚本。输入一下的代码: 然后保存运行: 运行后的截

    2024年02月04日
    浏览(31)
  • python 之xml 使用原生xml.dom

    一、xml操作 使用xml进行创建 二、获取值、修改值 直接获取数据 通过父节点定义子节点 并获取值 重新赋值 添加子节点 三、将一个xml文档,插入另一文档中(将一个节点值插入另一个节点) 将一个xml文档某个元素插入另一个文档,插入另一文档中 将另个文档中的节点,插入指

    2024年02月07日
    浏览(26)
  • Python批量修改、删除、替换xml文件内容(labelimg标注)

    使用模型训练自定义数据集之前,在用在网上搜索得到的图片制作数据集时,即使批量修改图片名称后,在使用labelimg标注得到的xml文件中,图片名称还是网络上图片原本的名称,这时需要对其进行批量修改。 然后先修改路径,将xml文件对应图片的真实路径替换。这里图片的

    2023年04月15日
    浏览(77)
  • Pyspark读写csv,txt,json,xlsx,xml,avro等文件

    读: 读: 写: 读: 写: 读: 写: 读: 写: 读: 写: 读: 写: 读: 写: 读: 写:

    2024年02月07日
    浏览(34)
  • C语言通过MSXML6.0读写XML文件(同时支持char[]和wchar_t[]字符数组)

    开发环境:Visual Studio 2010 运行环境:Windows XP SP3 读取XML文件可使用IXMLDOMDocument_load函数。   读取XML字符串可使用IXMLDOMDocument_loadXML函数。 创建XML文件可使用IXMLDOMDocument_save函数。 使用IXMLDOM Node _get_xml函数获取的是 单个节点 的XML字符串(不包括XML头部声明)。使用IXMLDOM Docu

    2024年01月22日
    浏览(29)
  • 如何使用Python和正则表达式处理XML表单数据

    在日常的Web开发中,处理表单数据是一个常见的任务。而XML是一种常用的数据格式,用于在不同的系统之间传递和存储数据。本文通过阐述一个技术问题并给出解答的方式,介绍如何使用Python和正则表达式处理XML表单数据。我们将探讨整体设计、编写思路和一个完整的案例,

    2024年02月10日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包