vlambda博客
学习文章列表

python3 读取XML文件的入坑经历

背景

  1. 由于需要从XML文件里,读取图片的列表。

  2. 需要读取xml里的路径,依次处理图片

  3. 所以,开始python xml文件的操作

  4. 开始时使用命令行的形式,读取xml文件的路径,然后判断文件是否存在,存在,就解析。

 

手写BUG


print(sys.argv) if len(sys.argv) >= 2: xml_file_path = sys.argv[0] # 注意,0是这个文件的本身! if os.path.exists(xml_file_path): xml_file_exist = True print(xml_file_exist) print("xml path is exist!") else: xml_file_path = '' print("xml path not exist!")

 

问题分析

  1. 命令行参数传错了,xml_file_path = sys.argv[1],才是传入的xml文件的路径,如果是sys.argv[0],那么,是执行的python文件本身!!

  2. 所以,文件存在,但是,文件解析失败!!并且是第一行第一列解析失败!!,最后我把XML文件删的只剩一行,依旧解析失败!!开始怀疑人品了。

  3. 文件编码,怎么改都不行!

  4. 最后,我用文件读取的方式读下xml文件内容,我惊住了,打印的怎么是我敲的代码!!

  5. 原来如此!!参数赋值错了。

 

正确的方法:  sys.argv[1] 才是第一个参数,  如  python xxx.py param,想获取param,需要:val = sys.argv[1]。

 

 

XML文件读取

 

这里使用:xml.etree.ElementTree

import xml.etree.ElementTree as ET

 

需要读取的xml文件


<?xml version="1.0" encoding="UTF-8"?>
<images>
<file format="argb8888" path="app.png"/>
<file format="argb8888" path="dcm.png"/>
<file format="argb8888" path="icon.png"/>
<file format="argb8888" path="res/images/btn_nor.9.png"/>
</images>

 

正确读取的函数


# 读取 xmldef pkg_png_to_hdc_from_xml(_path, xml_file): xml_file_path = os.path.join(_path, xml_file) if not os.path.exists(xml_file_path): sys.stdout.write("[xml] pkg_parse_xml_file failed! \n") return  with open(xml_file_path, 'r+', encoding='utf-8') as f: xml_info = f.read() tree = ET.fromstring(xml_info)  for child in list(tree): img_file = os.path.join(_path, child.get('path')) img_type = " -f " + child.get('format') if os.path.exists(img_file): cmd = app_pkg_gen_cmd(pkg_get_png_to_hdc_tool_path(), " -i ", img_file, img_type) execute_command(cmd) os.remove(img_file) f.close() os.remove(xml_file_path) # delete img.xml

 

总结

  1. 遇到文件,多打印信息,从而定位问题。

  2. python功能很强大,后期多多使用

  3. pycharm很专业,python语法提示、自动补全,都于python 默认的IDE。