批量转换合并XML转CSV文件时出现重复数据的问题求助
问题分析与解决思路
核心问题定位
你的代码出现大量重复数据,主要源于以下几个关键问题:
- 全局解析结果未清空:
rows应该是parse_xml存储单文件解析结果的容器,若它是全局变量且每次解析新XML前未重置,就会持续累积所有历史数据,导致每个新生成的df都包含之前所有文件的内容,最终拼接后重复数据泛滥。 - 无效的marshal操作:
marshal.dumps(file)和marshal.loads(data)完全多余——file本身就是字符串格式的文件名,直接传给parse_xml即可,这步操作对结果没有任何帮助。 - 低效且冗余的拼接与写入:循环内每次执行
pd.concat和to_csv,不仅会重复写入(最终文件是最后一次循环的累积结果,但核心问题还是数据本身重复),10万次concat还会严重拖慢程序速度、占用大量内存。
修正方案
1. 重构parse_xml,避免全局变量
让parse_xml直接返回当前文件的解析结果,从根源上避免数据累积:
def parse_xml(file_path): # 这里编写你的XML解析逻辑 rows = [] cols = ["列名1", "列名2", "列名3"] # 替换为实际列名 # 将当前XML文件的解析内容存入rows return rows, cols
2. 优化数据拼接与写入方式
用列表存储所有单文件的DataFrame,最后一次性拼接并写入,既解决重复问题,又提升效率:
import pandas as pd import os import glob os.chdir('/Users/dp/Dropbox/Ratings/SP') df_list = [] for file in glob.glob('*.xml'): # 直接传入文件名,移除无用的marshal操作 rows, cols = parse_xml(file) df = pd.DataFrame(rows, columns=cols) df_list.append(df) # 一次性拼接所有DataFrame,重置索引避免重复 result = pd.concat(df_list, ignore_index=True) # 最后仅写入一次CSV result.to_csv('output.csv', index=False)
3. 若无法修改parse_xml,手动重置全局rows
如果parse_xml必须依赖全局rows,每次循环前必须手动清空:
import pandas as pd import os import glob os.chdir('/Users/dp/Dropbox/Ratings/SP') df_list = [] global rows, cols # 声明全局变量 for file in glob.glob('*.xml'): rows = [] # 每次解析前清空结果容器 parse_xml(file) # 直接传入文件名 df = pd.DataFrame(rows, columns=cols) df_list.append(df) result = pd.concat(df_list, ignore_index=True) result.to_csv('output.csv', index=False)
额外优化建议
- 处理10万文件时,可加入进度提示(如
tqdm库),方便查看运行状态。 - 若XML文件体积较大,可分批次写入CSV:每处理1000个文件就用
mode='a'追加写入,第一次写入时保留表头,后续写入跳过表头,避免内存溢出。
内容的提问来源于stack exchange,提问作者ddp97
相关产品推荐
相关产品推荐

