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

Python遍历文件夹下XML文件批量转同名CSV文件报错如何解决?

问题根因
  • 入参类型错误:pandas的to_csv()方法要求传入字符串类型的文件存储路径,你的代码中将csvoutput定义为空白列表,类型不匹配直接触发报错。
  • 逻辑缩进错误:XML节点解析、数据组装、CSV写入的代码全部位于遍历文件的for循环外部,只会生效在最后一个遍历到的XML文件上,完全无法实现「每个XML对应输出同名CSV」的需求。
  • 文件名映射逻辑缺失:没有实现XML文件名转同名CSV文件名的逻辑,无法输出和原文件同名的CSV。
修正后可运行代码

以下代码已经修复上述问题,同时实现了常驻监听、避免重复处理的能力:

import os
import time
import xml.etree.cElementTree as Eltree
import pandas as pd

# 目标文件夹路径
path = r'C:/python_test'
# CSV表头配置
cols = ["serviceName", "startDate", "endDate"]
# 已处理文件记录集合,避免重复解析
processed_files = set()

# 常驻循环,按需调整扫描间隔
while True:
    # 本次扫描待处理的XML文件列表
    wait_process = []
    for filename in os.listdir(path):
        # 跳过非XML文件和已处理过的文件
        if not filename.endswith('.xml') or filename in processed_files:
            continue
        full_path = os.path.join(path, filename)
        wait_process.append((filename, full_path))

    # 逐个处理XML文件
    for raw_name, file_path in wait_process:
        rows = []
        channel = ""
        # 解析XML
        xmlparse = Eltree.parse(file_path)
        root = xmlparse.getroot()

        # 提取channel信息,增加非空判断避免节点不存在时报错
        for fixed in root.iter('{http://www.w3.org/2001/XMLSchema}channel'):
            channel_node = fixed.find("channelName")
            if channel_node is not None:
                channel = channel_node.text

        # 提取节目时间信息
        for dyn in root.iter('programInformation'):
            start_node = dyn.find("publishedStartTime")
            end_node = dyn.find("endTime")
            if start_node and end_node:
                rows.append({
                    "serviceName": channel,
                    "startDate": start_node.text,
                    "endDate": end_node.text
                })

        # 生成同名CSV的存储路径
        csv_name = raw_name.rsplit('.', 1)[0] + '.csv'
        csv_save_path = os.path.join(path, csv_name)
        # 写入CSV,关闭索引、指定编码避免中文乱码
        df = pd.DataFrame(rows, columns=cols)
        df.to_csv(csv_save_path, index=False, encoding='utf-8-sig')

        # 标记文件为已处理
        processed_files.add(raw_name)
        print(f"处理完成:{raw_name} -> {csv_name}")
    
    # 扫描间隔,单位秒,可根据需求调整
    time.sleep(10)
补充说明

如果不需要保留原XML文件,也可以在处理完成后删除原XML或者移动到备份文件夹,就不需要用processed_files集合记录已处理文件了。

内容的提问来源于stack exchange,提问作者Sptz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 21:57:01