You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:08:59