Python新手求教:合并子目录同名文本文件并按时间排序去重
解决Python合并同名文本文件并按时间排序、去重的问题
嘿,我来帮你搞定这个问题!你的代码已经搭好了文件收集和合并的基础框架,现在只需要补充按日期时间排序和去除重复数据的逻辑就行,咱们一步步来调整:
问题分析
先明确核心需求:
- 合并所有子目录中同名的
.txt文件 - 合并后的数据按每行开头的
DD:MM:YYYY:HH:MM:SS时间戳排序 - 完全重复的行只保留一次
你的原始代码完成了文件路径收集和简单合并,但缺少逐行处理、去重和排序的环节,咱们针对性修改即可。
修改后的完整代码
import os from datetime import datetime file_paths = {} # 第一步:收集所有同名txt文件的完整路径 for root, dirs, files in os.walk('.'): for f in files: if f.endswith('.txt'): if f not in file_paths: file_paths[f] = [] file_paths[f].append(os.path.join(root, f)) # 直接存完整路径,减少后续拼接 for filename, paths in file_paths.items(): all_unique_lines = set() # 用集合自动过滤重复行 # 第二步:读取所有文件的每一行,加入集合去重 for file_path in paths: with open(file_path, 'r') as f: for line in f: cleaned_line = line.rstrip('\n') # 统一处理换行符,避免因换行差异误判重复 if cleaned_line: # 跳过空行,避免无效内容 all_unique_lines.add(cleaned_line) # 第三步:定义排序规则,解析每行的时间戳 def get_time_key(line): # 提取时间戳部分:从行首到第一个逗号前,再去掉末尾的小数段(比如:0.04) time_segment = line.split(',')[0].rsplit(':', 1)[0] # 把字符串转成datetime对象,格式对应DD:MM:YYYY:HH:MM:SS return datetime.strptime(time_segment, '%d:%m:%Y:%H:%M:%S') # 第四步:对去重后的行按时间排序 sorted_lines = sorted(all_unique_lines, key=get_time_key) # 第五步:写入最终合并后的文件 with open(filename, 'w') as f_out: f_out.write('\n'.join(sorted_lines) + '\n') # 每行加上换行符,保证格式统一 print("合并、排序、去重操作完成!")
关键逻辑说明
- 路径收集优化:直接存储完整文件路径,避免后续重复拼接
root和文件名,代码更简洁。 - 去重实现:利用集合
set()的特性,自动过滤完全相同的行(先清理换行符,避免同一内容因换行差异被误判为不同行)。 - 时间排序:
- 从每行中提取纯时间戳字符串(去掉末尾的小数部分)
- 用
datetime.strptime()将字符串转换为可比较的datetime对象,排序时会自动按时间先后顺序排列
- 空行处理:跳过空行,避免合并后的文件出现多余的空白内容
测试验证
用你提供的两行数据测试:
30:01:2019:15:20:50:0.04,0.15,-5.05,81.25,35.47,-05.60,0.37,-1.61,0.22 20:01:2019:20:40:30:0.04,0.05,-1.04,71.25,55.37,-20.50,0.37,-5.71,0.24
合并排序后会先输出2019年1月20日的记录,再输出1月30日的记录;如果有重复行,只会保留一次。
内容的提问来源于stack exchange,提问作者Mukesh Kumar




