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
相关产品推荐
相关产品推荐

