You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python实现两目录同名文件数值行差值比对 现有代码结果异常求助

双目录同名文件行匹配比对方案

需求说明

遍历两个目录下的同名文件,按如下规则比对内容:
取dir1中文件的每一行,与dir2中同名文件的所有行逐一比对,若两行对应位置所有元素的差值绝对值都≤10,则输出dir1中的对应行。

原代码核心问题

  • 遍历逻辑错误:原代码采用逐行同步读取两个文件的方式,没有实现「dir1每行遍历dir2所有行」的要求,且dir2文件读取一次后指针不会重置,后续行比对时无法获取dir2的完整内容
  • 比对规则错误:原代码仅判断float(el1)-float(el2) < 11,没有取绝对值,负数差值的场景会直接漏判
  • 输出逻辑错误:全局单一same标记逻辑混乱,没有在匹配到符合规则的行时及时输出dir1的对应行
  • 基础问题:缺少import os依赖导入、循环内代码无缩进,无法直接运行

修复后可运行代码

import os

dir1 = "/home/one"
dir2 = "/home/two"

# 遍历dir1下的所有文件
for file in os.listdir(dir1):
    file2_path = os.path.join(dir2, file)
    # 仅处理dir2中存在的同名文件
    if os.path.isfile(file2_path):
        file1_path = os.path.join(dir1, file)
        # 先把dir2的所有行提前读出来存到列表,避免重复IO
        with open(file2_path, 'r', encoding='utf-8') as f2:
            f2_lines = [line.strip().split()[:4] for line in f2 if line.strip()]
        # 遍历dir1的每一行
        with open(file1_path, 'r', encoding='utf-8') as f1:
            for line1 in f1:
                line1 = line1.strip()
                if not line1:
                    continue
                l1_elements = list(map(float, line1.split()[:4]))
                # 遍历dir2的所有行逐一比对
                for l2_elements_str in f2_lines:
                    l2_elements = list(map(float, l2_elements_str))
                    # 长度不一致直接跳过
                    if len(l1_elements) != len(l2_elements):
                        continue
                    # 所有元素差值绝对值都≤10则匹配成功
                    if all(abs(e1 - e2) <= 10 for e1, e2 in zip(l1_elements, l2_elements)):
                        print(line1)
                        # 匹配到一次就可以跳出当前dir2行的循环,避免重复输出
                        break

测试验证

使用提供的测试用例运行:
dir1的file1.txt内容:

10 20 30
100 200 300
1000 2000 3000

dir2的file1.txt内容:

15 30 40
120 215 315
27 25 35

运行后输出结果为10 20 30,符合预期。

内容的提问来源于stack exchange,提问作者Nita Khanal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 11:24:08