Python新手求助:按文件名规则批量合并文件夹内的文本文件
合并成对文本文件的Python解决方案
嘿,作为Python新手能自己生成这么多文件已经超棒啦!针对你要合并A/B开头的成对文件需求,我整理了一套简单易懂的实现方案,咱们一步步来:
核心思路
- 先定位到
output文件夹,获取所有符合格式的文本文件 - 把文件名拆分成前缀(A/B)和后缀(比如
_0.20_1_.txt),将后缀相同的文件归为一组 - 遍历每一组,读取两个文件的内容并合并,写入新的
merged_A_B_xxx.txt格式文件
完整代码实现
import os # 定义目标文件夹路径 folder_path = "output" # 用来存储分组:key是共同后缀,value是对应的A/B文件路径 file_groups = {} # 遍历文件夹里的所有文件 for filename in os.listdir(folder_path): # 只处理txt文件 if filename.endswith(".txt"): # 拆分文件名:比如把"A_0.20_1_.txt"拆成前缀"A"和后缀"_0.20_1_.txt" # 用split("_", 1)确保只拆分第一个下划线,避免影响后面的命名部分 prefix, suffix = filename.split("_", 1) # 如果后缀不在字典里,就创建一个空列表 if suffix not in file_groups: file_groups[suffix] = [] # 把当前文件的完整路径加入对应组 file_groups[suffix].append(os.path.join(folder_path, filename)) # 遍历每个分组进行合并 for suffix, file_paths in file_groups.items(): # 确保每组有且只有两个文件(A和B开头的) if len(file_paths) == 2: # 筛选出A和B开头的文件路径 a_file = next(f for f in file_paths if os.path.basename(f).startswith("A_")) b_file = next(f for f in file_paths if os.path.basename(f).startswith("B_")) # 读取两个文件的内容 with open(a_file, "r", encoding="utf-8") as f_a: content_a = f_a.read() with open(b_file, "r", encoding="utf-8") as f_b: content_b = f_b.read() # 合并内容(这里默认A在前B在后,中间加换行;如果需要按行对应合并可以调整) merged_content = content_a + "\n" + content_b # 生成合并后的文件名 merged_filename = f"merged_A_B_{suffix}" merged_file_path = os.path.join(folder_path, merged_filename) # 写入合并后的文件 with open(merged_file_path, "w", encoding="utf-8") as f_merged: f_merged.write(merged_content) print(f"已完成合并:{merged_filename}") else: # 处理分组文件数量不对的情况,给新手提示 print(f"警告:后缀为{suffix}的文件有{len(file_paths)}个,无法完成合并,请检查文件命名!")
代码关键点说明
- 文件分组逻辑:用
split("_", 1)精准拆分文件名,不管后面的参数怎么变,只要后缀相同就会被分到一组,适配你的命名规则 - 编码处理:打开文件时指定
encoding="utf-8",避免不同系统下的字符乱码问题 - 异常提示:如果某组文件数量不是2个(比如只有A没有B,或者重复文件),会给出明确警告,方便你排查问题
- 合并灵活性:示例里是直接拼接内容,如果你需要按行对应合并(比如A的第1行和B的第1行放在同一行),可以随时告诉我调整代码
运行方式
把这段代码保存成merge_files.py,放在和output文件夹同级的目录下,直接运行就能自动完成所有成对文件的合并啦!
内容的提问来源于stack exchange,提问作者Cashoo
相关产品推荐
相关产品推荐

