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
相关产品推荐
相关产品推荐

