Python在IC中的应用,主要处理的对象以文本为主,但在某些的情况下,文本文件非常巨大,比如上G的文件。
这个时候,利用gvimdiff,tkdiff对文件的比对是比较慢甚至卡的,Python有很强大的数据处理能力,这里使用zip命令可以非常高效的进行文件比对。
下面脚本参考:
用法:./diff.py test1.log test2.log
./diff.pytest1.logtest2.log [NOTE]:Found(diff/total):564/5664differentlines [NOTE]:Fileisdifferent [NOTE]:Alldifferentlinesaresavedinfile:diffout.rpt
不同行内容输出到diffout.rpt文件中;
#!/tools/python-3.6.12/bin/python3.6 #-*-coding:UTF-8-*- importos importsys iflen(sys.argv)>1: file1=sys.argv[1] file2=sys.argv[2] else: print("[ERROR]======Pleaseentertwofile_path") print("[Usage]:Pythonscript.py") sys.exit() defcompare_files(file1,file2): total_lines=0 different_lines=0 withopen(file1,'r')asf1,open(file2,'r')asf2,open('diffout.rpt','w')asf_out: #逐行比较两个文件 fori,(line1,line2)inenumerate(zip(f1,f2)): ifline1!=line2: f_out.write('row'+str(i+1)+'isdifferent: ') f_out.write(' file1:'+line1.rstrip()+' ') f_out.write(' file2:'+line2.rstrip()+' ') different_lines+=1 total_lines+=1 iftotal_lines==0: print('Bothfilesareempty') ifdifferent_lines==0: print('Fileissame') else: print('[NOTE]:Found(diff/total):{}/{}differentlines'.format(different_lines,total_lines)) print('[NOTE]:Fileisdifferent') print('[NOTE]:Alldifferentlinesaresavedinfile:diffout.rpt') compare_files(file1,file2)
其中简单说明两个函数:enumerate()和zip(f1, f2)
enumerate() 是 Python 内置函数,它接受一个可迭代对象(如列表、元组、字符串等)作为输入,返回一个枚举对象。
这个枚举对象包含每个元素的索引和值,可以用来遍历序列时获取当前元素的索引。
以下是一个使用 enumerate() 函数的示例:
fruits=['apple','banana','cherry'] fori,fruitinenumerate(fruits): print(i,fruit)
在上面的代码中,enumerate() 函数将 fruits 列表转换为一个枚举对象,遍历该对象时,每个元素会被拆分成两部分,一部分是索引,一部分是值。
输出结果:
0apple 1banana 2cherry
在循环体内,我们可以使用 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-*- importos importsys importdifflib iflen(sys.argv)>1: file1=sys.argv[1] file2=sys.argv[2] else: print("[ERROR]======Pleaseentertwofile_path") print("[Usage]:Pythonscript.py") sys.exit() defdiff_files(file1,file2,output_file): #读取两个文件的内容 withopen(file1,'r')asf1,open(file2,'r')asf2: text1=f1.read() text2=f2.read() #生成差异信息的HTML格式 d=difflib.HtmlDiff() html=d.make_file(text1.splitlines(),text2.splitlines()) #将HTML内容写入文件 withopen(output_file,'w')asf: f.write(html) print(" Diffcompleted.") if__name__=='__main__': diff_files(file1,file2,'difflib.html')
上面的代码中,使用 difflib.HtmlDiff() 类的 make_file() 方法生成差异信息的 HTML 格式。
注意要使用 splitlines() 方法将文本转换为行列表。
生成的 HTML 文件中,差异信息会以表格形式呈现,每一行的左侧显示行号,右侧显示该行的内容。
这种格式的输出相对于纯文本格式的输出更容易阅读和理解,特别是在需要比对较长文本时,能够提高比对效率和结果的准确性。
审核编辑:刘清
-
HTML
+关注
关注
0文章
277浏览量
34078 -
python
+关注
关注
55文章
4766浏览量
84364
原文标题:Python进行文件比对
文章出处:【微信号:数字ICer,微信公众号:数字ICer】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
评论