You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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("合并、排序、去重操作完成!")

关键逻辑说明

  1. 路径收集优化:直接存储完整文件路径,避免后续重复拼接root和文件名,代码更简洁。
  2. 去重实现:利用集合set()的特性,自动过滤完全相同的行(先清理换行符,避免同一内容因换行差异被误判为不同行)。
  3. 时间排序
    • 从每行中提取纯时间戳字符串(去掉末尾的小数部分)
    • datetime.strptime()将字符串转换为可比较的datetime对象,排序时会自动按时间先后顺序排列
  4. 空行处理:跳过空行,避免合并后的文件出现多余的空白内容

测试验证

用你提供的两行数据测试:

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

火山引擎 最新活动