如何在Python脚本遇空XML文件时跳过并处理下一个文件?
解决XML文件处理时跳过空文件的问题
我来帮你搞定这个问题!你的核心问题是遇到无有效数据的文件时用了sys.exit()直接终止了整个程序,只要把这个逻辑改成跳过当前文件继续循环就行。另外我还修复了代码里的一些小bug,比如变量名笔误和Python版本兼容问题,以下是修改后的完整代码:
from lxml import etree as ET import pandas as pd import glob import sys import os path = r'C:\Users\sky\Documents' # 用r前缀避免转义字符问题 # 遍历目录下所有XML文件 for filename in glob.glob(os.path.join(path, '*.xml')): try: # 解析XML文件,捕获解析异常 tree = ET.parse(filename) root = tree.getroot() except ET.ParseError: print(f"警告:文件 {filename} 格式错误或损坏,已跳过") continue # 提取Book信息 books = [] for book in root.findall('.//Book/Message//'): name_elem = book.find('Name') if name_elem is not None and name_elem.text is not None: books.append(name_elem.text) # 如果当前文件没有有效Book数据,跳过后续处理 if not books: print(f"文件 {filename} 未找到有效Book数据,已跳过") continue # 提取Author信息 authors = [] for auth in root.findall('./Book/Message/author'): if auth.attrib: # 判断是否有属性 author = auth.get('name') # 修正变量名笔误:number -> auth if author is not None: authors.append(author) # 构建DataFrame,处理Author长度不匹配的情况 df_final = pd.DataFrame({'Book': books}) if authors: # 如果Author数量和Book不一致,填充空值 df_final['Author'] = authors + [None] * (len(books) - len(authors)) else: df_final['Author'] = None # 写入CSV文件,简化判断逻辑 file_exists = os.path.isfile('books.csv') df_final.to_csv( 'books.csv', sep=',', mode='a' if file_exists else 'w', header=not file_exists, index=False ) print(f"文件 {filename} 处理成功!")
关键修改说明:
- 替换终止逻辑为跳过:把原来的
sys.exit('No Book was found!')改成continue,当当前文件无有效数据时,打印提示后直接进入下一个文件的循环。 - 增加异常捕获:用
try-except包裹XML解析代码,遇到损坏或格式错误的文件时不会崩溃,而是跳过该文件。 - 修正变量名笔误:原来代码中
author = number.get('name')里的number是错误的,应该是auth。 - 优化数据提取逻辑:增加对
name_elem.text的非空判断,避免提取到空值;处理Author和Book数量不一致的情况,填充空值保证DataFrame结构正常。 - 适配Python 3语法:把
print语句改成带括号的函数调用,同时在路径字符串前加r前缀避免转义字符问题。
内容的提问来源于stack exchange,提问作者M-M
相关产品推荐
相关产品推荐

