示例

之前拿ET写xml,直接对root节点调用write函数,会出现产生的xml字符串没有缩进,是干巴巴的一行,可读性比较差,就像下面这样:

<annotation><filename>VW_CH3ENTERPRIZEVsTaurus_BO2_1_4_7.jpg</filename><size><width>168.81600000000006</width><height>121.66920000000009</height></size><object><name>Car</name><bndbox><xmin>14.068</xmin><ymin>10.139</ymin><xmax>154.748</xmax><ymax>111.53</ymax><width>140.68000000000006</width><height>101.39100000000008</height></bndbox></object><object><name>RedArmor3</name><bndbox><xmin>71.108</xmin><ymin>68.439</ymin><xmax>116.728</xmax><ymax>93.787</ymax><width>45.61999999999989</width><height>25.347999999999956</height></bndbox></object><object><name>RedArmor3</name><bndbox><xmin>17.878</xmin><ymin>59.567</ymin><xmax>44.488</xmax><ymax>87.45</ymax><width>26.6099999999999</width><height>27.883000000000038</height></bndbox></object><object><name>RedArmor3</name><bndbox><xmin>39.418</xmin><ymin>44.359</ymin><xmax>72.368</xmax><ymax>74.776</ymax><width>32.950000000000045</width><height>30.41700000000003</height></bndbox></object></annotation>

解决办法

看到一个不错的方法:
https://www.cnblogs.com/muffled/p/3462157.html
原理 先对root进行修饰,调用一个自定义的修饰函数

def indent(elem, level=0):
i = "\n" + level*"\t"
if len(elem):
if not elem.text or not elem.text.strip():
elem.text = i + "\t"
if not elem.tail or not elem.tail.strip():
elem.tail = i
for elem in elem:
indent(elem, level+1)
if not elem.tail or not elem.tail.strip():
elem.tail = i
else:
if level and (not elem.tail or not elem.tail.strip()):
elem.tail = i

之后的效果就会很棒:

<annotation>
<filename>VW_CH3ENTERPRIZEVsTaurus_BO2_1_5_4.jpg</filename>
<size>
<width>207</width>
<height>213</height>
</size>
<object>
<name>Car</name>
<bndbox>
<xmin>17.237</xmin>
<ymin>17.744</ymin>
<xmax>189.602</xmax>
<ymax>195.179</ymax>
<width>172.4</width>
<height>177.4</height>
</bndbox>
</object>
<object>
<name>RedArmor2</name>
<bndbox>
<xmin>140.173</xmin>
<ymin>128.007</ymin>
<xmax>173.125</xmax>
<ymax>152.087</ymax>
<width>33.0</width>
<height>24.1</height>
</bndbox>
</object>
<object>
<name>RedArmor2</name>
<bndbox>
<xmin>51.457</xmin><annotation>
<filename>VW_CH3ENTERPRIZEVsTaurus_BO2_1_5_4.jpg</filename>
<size>
<width>207</width>
<height>213</height>
</size>
<object>
<name>Car</name>
<bndbox>
<xmin>17.237</xmin>
<ymin>17.744</ymin>
<xmax>189.602</xmax>
<ymax>195.179</ymax>
<width>172.4</width>
<height>177.4</height>
</bndbox>
</object>
<object>
<name>RedArmor2</name>
<bndbox>
<xmin>140.173</xmin>
<ymin>128.007</ymin>
<xmax>173.125</xmax>
<ymax>152.087</ymax>
<width>33.0</width>
<height>24.1</height>
</bndbox>
</object>
<object>
<name>RedArmor2</name>
<bndbox>
<width>31.7</width>
<height>27.9</height>
</bndbox>
</object>
</annotation>

python Elementtree 生成带缩进格式的xml文件的更多相关文章

  1. Python生成PASCAL VOC格式的xml标注文件

    Python生成PASCAL VOC格式的xml标注文件 PASCAL VOC数据集的标注文件是xml格式的.对于py-faster-rcnn,通常以下示例的字段是合适的: <annotatio ...

  2. T4 模板自动生成带注释的实体类文件

    T4 模板自动生成带注释的实体类文件 - 只需要一个 SqlSugar.dll 生成实体就是这么简单,只要建一个T4文件和 文件夹里面放一个DLL. 使用T4模板教程 步骤1 创建T4模板 如果你没有 ...

  3. 节点文件将两个不同格式的XML文件,进行节点对照,并生成一个用于对照功能的XML

    本文纯属个人见解,是对前面学习的总结,如有描述不正确的地方还请高手指正~ 经常有的需求是,需要将一种格式的XML转换成另一种XML.如果要实现这个功能首先需要将两个不同XML手动建立节点对比关系.然后 ...

  4. java生成带html样式的word文件

    参考:http://blog.csdn.net/xiexl/article/details/6652230 最近在项目中需要将通过富文本编辑器处理过的文字转换为Word,查了很久,大家通常的解决办法是 ...

  5. 【Selenium + Python】之 Excel、CSV、XML文件读取数据并运用数据百度查询

    目录 从Excel读取数据进行百度搜索 从CSV读取数据进行百度搜索 从XML读取数据进行登录操作 附:其他学习资料(<xml.etree.ElementTree模块>.<pytho ...

  6. 【Python实例一】使用minidom读取xml文件

    前言:最近刚在廖雪峰老师的网站里学习了Python的基础内容,想着循序渐进地找点实例练练手,网上看到有很多相关资料,决定针对感兴趣的内容实际编码实践一下,昨天刚好看到有关使用Python来读取XML文 ...

  7. 用vim写python脚本的自动缩进格式设置

  8. T4 模板自动生成带注释的实体类文件 - 只需要一个 SqlSugar.dll

    生成实体就是这么简单,只要建一个T4文件和 文件夹里面放一个DLL. 使用T4模板教程 步骤1 创建T4模板 ,一定要自已新建,把T4代码复制进去,好多人因为用我现成的T4报错(原因不明) 点击添加文 ...

  9. mybatisGenerator自动生成pojo、dao、xml文件

    一.简介: mybatisGenerator是一款自动生成文件工具.本文使用idea2017.3.1来进行操作. 二.文件生成之后的项目结构: 三.开始生成步骤: 1.使用idea生成maven的结构 ...

  10. android屏幕适配,生成不同分辨率的dimen.xml文件

    一.在项目下新建moudle,选择Java Library 二.DimenUtils类 public class DimenUtils { //文件保存的路径 是在该项目下根路径下创建 比如该项目创建 ...

随机推荐

  1. 使用viper读取配置文件

    配置文件config.yml mysql: type: mysql dsn: "user:pass@tcp(localhost:30306)/db_name?charset=utf8& ...

  2. 关于filter_input函数

    PHP: filter_input <?php $search_html = filter_input(INPUT_GET, 'search', FILTER_SANITIZE_SPECIAL_ ...

  3. Windows下使用Fortran读取HDF5文件

    需要用Fortran读取HDF5格式的GPM IMERG卫星降水文件,在已经安装HDF5库(参见VS2019+ Intel Fortran (oneAPI)+HDF5库的安装+测试 - chinago ...

  4. managing projects with GNU make pdf

    读 c++编程思想的时候作者推荐的关于makefile的书,大家随意抱走. 链接:https://pan.baidu.com/s/1k0qg9iA3V25C2yJnOi9WfQ 提取码:5vx1

  5. 如何使用cmd(dos命令)关闭IIS中某个站点

    在 目录  C:\Windows\System32\inetsrv 下面有一个 appcmd 程序,定位到 该目录下 appcmd site /?  #管理站点 appcmd /? #管理整个IIS ...

  6. C++ Error:C2011: 'struct' type redefinition

    C++ Error:C2011: 'struct' type redefinition        在c语言中,对同一个变量或者函数进行多次声明是不会报错的.所以如果h文件里只是进行了声明工作,即使 ...

  7. 为什么Controller层注入的是Service接口,而不是ServiceImpl实现类

    转自csdn--https://blog.csdn.net/weixin_39565597/article/details/78078728 今天看代码发现,写法和自己理解的java写法不一致,就查找 ...

  8. Python学习笔记调式之抛出异常

    随笔记录方便自己和同路人查阅. #------------------------------------------------我是可耻的分割线--------------------------- ...

  9. Vuex学习记录篇之王阿姨畅谈Vuex

    Vuex是干什么的,相信很多人和我一样刚开始不大清楚 大家都知道Vue实现组件通信(传参)有很多方式所谓通信就是指数据共享,父子通信,兄弟通信但是如果要频繁实现数据共享,那么以上的方法就有点力不从心了 ...

  10. vmware 二次虚拟化

    在创建的虚拟机的目录内找到扩展名为vmx的文件,在文件的最后添加  hypervisor.cpuid.v0 = "FALSE" 保存 重新打开虚拟机在 在虚拟机配置开启虚拟化