Python进行文件比对简析

python在ic中的应用,主要处理的对象以文本为主,但在某些的情况下,文本文件非常巨大,比如上g的文件。
这个时候,利用gvimdiff,tkdiff对文件的比对是比较慢甚至卡的,python有很强大的数据处理能力,这里使用zip命令可以非常高效的进行文件比对。
下面脚本参考:
用法:./diff.py test1.log test2.log
./diff.py test1.log test2.log[note]:found (diff/total): 564/5664 different lines[note]:file is different[note]:all different lines are saved in file: diffout.rpt  
不同行内容输出到diffout.rpt文件中;
#!/tools/python-3.6.12/bin/python3.6# -*- coding: utf-8 -*- import osimport sysif len(sys.argv) > 1:    file1 = sys.argv[1]    file2 = sys.argv[2]else:    print([error] ====== please enter two file_path)    print([usage]: python script.py    )    sys.exit()    def compare_files(file1, file2):    total_lines = 0    different_lines = 0    with open(file1, 'r') as f1, open(file2, 'r') as f2,open('diffout.rpt', 'w') as f_out:        # 逐行比较两个文件        for i, (line1, line2) in enumerate(zip(f1, f2)):            if line1 != line2:                f_out.write('row ' + str(i+1) + ' is different:')                f_out.write(' file1:' + line1.rstrip() + '')                f_out.write(' file2:' + line2.rstrip() + '')                different_lines += 1            total_lines += 1    if total_lines == 0:        print('both files are empty')    if different_lines == 0:        print('file is same')    else:        print('[note]:found (diff/total): {}/{} different lines'.format(different_lines, total_lines))        print('[note]:file is different')        print('[note]:all different lines are saved in file: diffout.rpt')compare_files(file1, file2)  
其中简单说明两个函数:enumerate()和zip(f1, f2)
enumerate() 是 python 内置函数,它接受一个可迭代对象(如列表、元组、字符串等)作为输入,返回一个枚举对象。
这个枚举对象包含每个元素的索引和值,可以用来遍历序列时获取当前元素的索引。
以下是一个使用 enumerate() 函数的示例:
fruits = ['apple', 'banana', 'cherry']for i, fruit in enumerate(fruits):    print(i, fruit)  
在上面的代码中,enumerate() 函数将 fruits 列表转换为一个枚举对象,遍历该对象时,每个元素会被拆分成两部分,一部分是索引,一部分是值。
输出结果:
0 apple   1 banana   2 cherry     
在循环体内,我们可以使用 i 变量来访问当前元素的索引,使用 fruit 变量来访问当前元素的值。
zip(f1, f2) 是将两个可迭代对象 f1 和 f2 中的对应元素一一配对,生成一个新的迭代器;
在比较文件的过程中,zip() 函数可以用来同时遍历两个文件对象 f1 和 f2,逐行比较它们的内容。
这里再额外提一个利用difflib 模块进行文件比对
使用 difflib 模块进行文件比对可以得到更详细的文件差异信息。difflib 模块提供了多种比对算法和函数,可以用来比较文本文件、代码文件等;
使用 difflib.htmldiff() 类来生成差异信息的 html 格式。
下面是一个示例代码,它比对两个文件并将差异信息以 html 格式输出到文件difflib.html 中
#!/tools/python-3.6.12/bin/python3.6# -*- coding: utf-8 -*- import osimport sysimport difflibif len(sys.argv) > 1:    file1 = sys.argv[1]    file2 = sys.argv[2]else:    print([error] ====== please enter two file_path)    print([usage]: python script.py    )    sys.exit()def diff_files(file1, file2, output_file):    # 读取两个文件的内容    with open(file1, 'r') as f1, open(file2, 'r') as f2:        text1 = f1.read()        text2 = f2.read()    # 生成差异信息的 html 格式    d = difflib.htmldiff()    html = d.make_file(text1.splitlines(), text2.splitlines())    # 将 html 内容写入文件    with open(output_file, 'w') as f:        f.write(html)    print(diff completed.)if __name__ == '__main__':    diff_files(file1, file2, 'difflib.html')  
上面的代码中,使用 difflib.htmldiff() 类的 make_file() 方法生成差异信息的 html 格式。
注意要使用 splitlines() 方法将文本转换为行列表。
生成的 html 文件中,差异信息会以表格形式呈现,每一行的左侧显示行号,右侧显示该行的内容。
这种格式的输出相对于纯文本格式的输出更容易阅读和理解,特别是在需要比对较长文本时,能够提高比对效率和结果的准确性。


剖析智能交通的几个发展趋势
城堡防御公司发布新的人工智能软件和网络解决方案
柔性可穿戴器件对未来穿戴带来变革发展
智能门锁真的好用吗?好用在哪里?
120亿!三安光电Mini/Micro LED芯片项目落户湖北鄂州
Python进行文件比对简析
文心一言发布,百度医疗类广告营收会下降么?
使用at_device软件包通过ESP8266连接到网络
智能无接触电梯的工作原理解析
又一起电动汽车自燃事件!三元锂电池还能继续使用吗?
激光电视是未来发展的方向,其潜力不可估量
无人超市APP开发前景
导通孔、盲孔、埋孔、钻孔等,这些PCB中的“孔”你都知道是怎么回事吗
创新K3+外置声卡评测 强大且实惠
CPK-RA6M4评估板入门指南(二)
运放与电压比较器有什么不一样
信息技术农产品质量安全的可追溯
不只有CPU,细数移动GPU的那些事
线路电抗器的应用场合
“双十一”实力开跑,海信电视拿下多个榜单第一