Python中如何按文件名日期匹配处理xml、txt文件并按日期分组输出
问题根因
你的代码当前存在两个核心问题:
- xml_dates存在重复日期,嵌套循环会重复处理同一个日期的txt文件,产生冗余计算
- 所有符合条件的行都直接追加到to_csv全局列表,没有按日期做分组封装
修正方案
调整循环逻辑,先对xml日期去重,每个日期单独创建临时列表存储数据,处理完成后再放入全局列表即可。
修改后的完整代码如下:
import os import re import csv output_xml = r"c:\desktop\energy\XML_Output" output_txt = r"c:\desktop\energy\TXT_Output" xml_name = os.listdir(output_xml) txt_name = os.listdir(output_txt) txt_name = [x.replace('-', '') for x in txt_name] # 去掉文件名中的横杠 # 提取xml和txt文件的日期 xml_dates = [] for file in xml_name: find = re.search("_(.\d+)-", file).group(1) xml_dates.append(find) txt_dates = [] for file in txt_name: find = re.search("MM(.+?)AB", file).group(1) txt_dates.append(find) # 对xml日期去重,避免重复处理同一日期 unique_xml_dates = list(set(xml_dates)) to_csv = [] # 只遍历去重后的日期 for date_xml in unique_xml_dates: if date_xml not in txt_dates: continue # 匹配对应txt和xml文件 match_txt = [s for s in txt_name if date_xml in s] match_xml = [s for s in xml_name if date_xml in s] # 还原txt文件名格式 match_txt_temp = match_txt[0] match_txt_score = match_txt_temp[:6]+'-'+match_txt_temp[6:8]+'-'+match_txt_temp[8:10]+'-'+match_txt_temp[10:12]+match_txt_temp[12:] # 创建当前日期的临时存储列表 current_date_rows = [] with open(os.path.join(output_txt, match_txt_score), "r") as outer: reader = csv.reader(outer, delimiter="\t") for row in reader: if not row: continue # csv读取的内容为字符串,需转数字后再比较大小 energy_level = int(row[20]) if energy_level > 250: current_date_rows.append(row) # 把当前日期的所有行加入全局列表 if current_date_rows: to_csv.append(current_date_rows) print(to_csv)
补充说明
- 新增
unique_xml_dates对xml日期去重,避免同一个日期被多次重复处理 - 每个日期处理时创建
current_date_rows临时列表存储该日期所有符合条件的行,处理完成后再追加到to_csv,实现按日期分组的效果 - 修复了原代码中重复遍历reader会跳过首行、字符串直接和数字比较的逻辑错误
- 用
os.path.join拼接路径,避免不同系统的路径分隔符兼容问题 - 优化了冗余的嵌套循环逻辑,运行效率更高
内容的提问来源于stack exchange,提问作者ManCity10
相关产品推荐
相关产品推荐

