按文件名条件合并多CSV文件的技术问题求助
按指定顺序合并同标识CSV文件的解决方案
看起来你之前的合并操作因为没做好分组和排序,导致结果不符合预期——既漏了B类文件,还把所有A类混在一起合并了。别担心,用Python的pandas库可以轻松搞定这个需求,下面是具体的实现步骤和代码:
核心思路
- 精准分组:根据文件名里的前缀(比如
Name1)和类别(A/B)把文件分成独立的组,比如Name1_A组、Name2_B组,确保不同组的文件不会互相干扰。 - 按规则排序:每个组内的
Stuff文件按数字顺序(Stuff1→Stuff2→Stuff3)排列,Total文件可以根据你的需求放在最前面或者最后面。 - 组内合并:对每个分组单独执行合并操作,最后输出对应结果。
具体代码实现
步骤1:导入依赖库
import os import pandas as pd import re
步骤2:定义路径和分组规则
把下面的路径替换成你的CSV文件所在的文件夹路径:
csv_folder = "./your_csv_files" # 替换成你的实际路径
接下来用正则表达式提取文件名里的关键信息,完成分组和排序:
# 正则匹配文件名结构:前缀_类型_类别.csv filename_pattern = re.compile(r"(\w+)_(Total|Stuff\d+)_(\w+)\.csv") # 存储Total文件和分组后的Stuff文件 total_files = {} sorted_stuff_groups = {} for filename in os.listdir(csv_folder): if not filename.endswith(".csv"): continue match_result = filename_pattern.match(filename) if not match_result: print(f"跳过不符合命名规则的文件:{filename}") continue prefix = match_result.group(1) # 提取Name1、Name2这类前缀 file_type = match_result.group(2) # 提取Total或StuffN category = match_result.group(3) # 提取A/B类别 group_key = (prefix, category) # 用(前缀,类别)作为分组的唯一标识 if file_type == "Total": # 记录每个分组对应的Total文件 total_files[group_key] = filename elif file_type.startswith("Stuff"): # 提取Stuff后面的数字作为排序依据 sort_num = int(file_type.split("Stuff")[-1]) if group_key not in sorted_stuff_groups: sorted_stuff_groups[group_key] = [] sorted_stuff_groups[group_key].append( (sort_num, filename) ) # 对每个Stuff分组按数字排序 for key in sorted_stuff_groups: sorted_stuff_groups[key] = [f for (num, f) in sorted(sorted_stuff_groups[key])]
步骤3:按顺序合并文件
这里实现的是把Stuff文件按顺序合并到对应的Total文件中,如果你需要合并成新文件而不是覆盖Total,可以修改输出文件名:
for group_key in sorted_stuff_groups: # 检查当前分组是否有对应的Total文件 if group_key not in total_files: print(f"警告:分组{group_key}未找到对应的Total文件,跳过合并") continue total_filename = total_files[group_key] stuff_files = sorted_stuff_groups[group_key] # 读取Total文件作为合并的基础 total_file_path = os.path.join(csv_folder, total_filename) merged_data = pd.read_csv(total_file_path) # 按顺序读取并合并每个Stuff文件 for stuff_file in stuff_files: stuff_path = os.path.join(csv_folder, stuff_file) stuff_data = pd.read_csv(stuff_path) # 行合并(追加数据),如果需要列合并可以把axis设为1 merged_data = pd.concat([merged_data, stuff_data], ignore_index=True) # 保存合并结果:这里直接覆盖原Total文件,也可以改成新文件名 output_path = os.path.join(csv_folder, total_filename) # 如果你想生成新文件,可以用下面的命名: # output_path = os.path.join(csv_folder, f"{group_key[0]}_Merged_{group_key[1]}.csv") merged_data.to_csv(output_path, index=False) print(f"✅ 已完成合并:{total_filename}")
关键注意事项
- 列名一致性:确保同组内的所有CSV文件列名一致,否则合并后会出现
NaN值。如果列名不一致,可以在读取文件时指定usecols参数只保留共同列。 - 命名规则统一:所有需要合并的文件必须严格遵循
前缀_类型_类别.csv的命名格式,比如Name1_Stuff1_A.csv、Name2_Total_B.csv,否则会被跳过。 - 路径权限:确保你有读取CSV文件夹和写入文件的权限,避免报错。
内容的提问来源于stack exchange,提问作者Karma
相关产品推荐
相关产品推荐

