解决Python NameError问题及XML文件字符串匹配移动需求
问题1:NameError错误排查与修复
错误原因
原代码里的shutil.move语句写在了for循环的外部,filename是for循环的局部变量,循环结束后这个变量就失效了,执行到这三行时自然会抛出NameError: name 'filename' is not defined。
另外原代码还有两个潜在问题:
os.mkdir("Done\\")如果Done目录已经存在会报错,建议改用os.makedirs("Done\\", exist_ok=True)glob.glob(path+"*.jpg")如果path末尾没有路径分隔符(比如\),会导致路径拼接错误,应该用os.path.join(path, "*.jpg")来保证跨平台兼容性
修复后的完整代码
import os import glob import shutil def remove_ext(list_of_pathnames): """移除每个文件名的扩展名""" return [os.path.splitext(filename)[0] for filename in list_of_pathnames] path = os.getcwd() os.chdir("D:\\TomProject\\Images\\") # 用makedirs并设置exist_ok=True,避免目录已存在报错 os.makedirs("Done\\", exist_ok=True) newpath = os.path.join("D:\\TomProject\\", "image_with_xml") # 确保目标目录存在 os.makedirs(newpath, exist_ok=True) # 用os.path.join正确拼接路径 list_of_jpgs = glob.glob(os.path.join(path, "*.jpg")) list_of_xmls = glob.glob(os.path.join(path, "*.xml")) list_of_txts = glob.glob(os.path.join(path, "*.txt")) print(list_of_jpgs, "\n\n", list_of_xmls, "\n\n", list_of_txts) # 调试用,可删除 jpgs_without_extension = remove_ext(list_of_jpgs) xmls_without_extension = remove_ext(list_of_xmls) txts_without_extension = remove_ext(list_of_txts) for filename in jpgs_without_extension: if filename in xmls_without_extension and filename in txts_without_extension: print("moving", filename) # 调试用,可删除 # 将move语句缩进,放到if判断内部,确保filename变量有效 shutil.move(f"{filename}.jpg", newpath) shutil.move(f"{filename}.xml", newpath) shutil.move(f"{filename}.txt", newpath)
问题2:遍历XML文件查找指定字符串并移动的实现思路
核心步骤
- 准备工作:先定义要查找的目标字符串、XML文件所在的源目录,以及要移动到的目标目录。用
os.makedirs(target_dir, exist_ok=True)确保目标目录存在,避免报错。 - 遍历XML文件:用
glob.glob(os.path.join(source_dir, "*.xml"))获取所有XML文件的完整路径。 - 检查文件内容:循环遍历每个XML文件,打开文件读取内容(注意指定合适的编码,比如
utf-8),判断目标字符串是否在内容中。 - 移动文件:如果找到目标字符串,调用
shutil.move(xml_file_path, target_dir)将文件移到指定目录。
示例代码片段
import os import glob import shutil # 配置参数 source_dir = "D:\\TomProject\\Images" target_dir = "D:\\TomProject\\Images\\Matched_XML" target_string = "要查找的指定字符串" # 确保目标目录存在 os.makedirs(target_dir, exist_ok=True) # 遍历所有XML文件 for xml_file in glob.glob(os.path.join(source_dir, "*.xml")): try: # 读取XML文件内容 with open(xml_file, "r", encoding="utf-8") as f: content = f.read() # 判断是否包含目标字符串 if target_string in content: shutil.move(xml_file, target_dir) print(f"已移动文件: {xml_file}") except Exception as e: print(f"处理文件 {xml_file} 时出错: {str(e)}")
额外提示
- 如果XML文件较大,逐行读取判断可以节省内存:把
content = f.read()改成for line in f: if target_string in line: ... - 可以根据需求扩展,比如同时移动对应的jpg/txt文件(通过文件名匹配)
内容的提问来源于stack exchange,提问作者tom meskin
相关产品推荐
相关产品推荐

