如何在Python文件迁移代码中用ElementTree查找指定XML元素并控制迁移
解决方案代码
import os import glob import shutil import xml.etree.ElementTree as ET def remove_ext(list_of_pathnames): """移除每个文件名的扩展名""" return [os.path.splitext(filename)[0] for filename in list_of_pathnames] # 目标目录配置 target_dir = "D:\\TomProject\\" new_dir = os.path.join(target_dir, "Done") # 创建目标文件夹,已存在则不报错 os.makedirs(new_dir, exist_ok=True) # 获取目标目录下的所有对应文件 list_of_jpegs = glob.glob(os.path.join(target_dir, '*.jpeg')) list_of_xmls = glob.glob(os.path.join(target_dir, '*.xml')) list_of_txts = glob.glob(os.path.join(target_dir, '*.txt')) # 生成无扩展名的文件名映射(方便快速查找) jpeg_map = {os.path.splitext(os.path.basename(p))[0]: p for p in list_of_jpegs} txt_map = {os.path.splitext(os.path.basename(p))[0]: p for p in list_of_txts} # 遍历所有XML文件,检查目标元素 for xml_path in list_of_xmls: # 获取无扩展名的文件名(用于匹配jpeg和txt) file_base = os.path.splitext(os.path.basename(xml_path))[0] try: # 解析XML文件 tree = ET.parse(xml_path) root = tree.getroot() # 替换成你要检查的特定元素路径,示例:检查是否存在名为"target_element"的直接子元素 # 若需嵌套查找可改为root.find(".//嵌套元素/子元素") target_element = root.find("target_element") if target_element is not None: # 检查对应jpeg和txt是否存在 if file_base in jpeg_map and file_base in txt_map: print(f"移动文件组: {file_base}") # 移动三个文件 shutil.move(jpeg_map[file_base], new_dir) shutil.move(xml_path, new_dir) shutil.move(txt_map[file_base], new_dir) except ET.ParseError: print(f"XML文件解析失败: {xml_path}") continue
关键改动说明
- 新增XML元素检查逻辑:使用
xml.etree.ElementTree解析XML文件,通过find()方法判断目标元素是否存在,可根据实际需求修改元素路径(比如嵌套元素的查找语法) - 优化文件夹创建:用
os.makedirs(..., exist_ok=True)替代os.mkdir(),避免重复运行时因文件夹已存在抛出异常 - 调整遍历逻辑:以XML文件为核心遍历,先验证元素条件,再匹配对应的jpeg和txt文件,逻辑更清晰
- 文件名映射优化:用字典存储文件名与路径的映射,比原代码的列表查找效率更高
- 异常处理:添加XML解析异常捕获,避免单个损坏的XML文件中断整个程序运行
内容的提问来源于stack exchange,提问作者tom meskin
相关产品推荐
相关产品推荐

