Python在IC中的應(yīng)用,主要處理的對象以文本為主,但在某些的情況下,文本文件非常巨大,比如上G的文件。
這個(gè)時(shí)候,利用gvimdiff,tkdiff對文件的比對是比較慢甚至卡的,Python有很強(qiáng)大的數(shù)據(jù)處理能力,這里使用zip命令可以非常高效的進(jìn)行文件比對。
下面腳本參考:
用法:./diff.py test1.log test2.log
./diff.pytest1.logtest2.log [NOTE]:Found(diff/total):564/5664differentlines [NOTE]:Fileisdifferent [NOTE]:Alldifferentlinesaresavedinfile:diffout.rpt
不同行內(nèi)容輸出到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: #逐行比較兩個(gè)文件 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)
其中簡單說明兩個(gè)函數(shù):enumerate()和zip(f1, f2)
enumerate() 是 Python 內(nèi)置函數(shù),它接受一個(gè)可迭代對象(如列表、元組、字符串等)作為輸入,返回一個(gè)枚舉對象。
這個(gè)枚舉對象包含每個(gè)元素的索引和值,可以用來遍歷序列時(shí)獲取當(dāng)前元素的索引。
以下是一個(gè)使用 enumerate() 函數(shù)的示例:
fruits=['apple','banana','cherry'] fori,fruitinenumerate(fruits): print(i,fruit)
在上面的代碼中,enumerate() 函數(shù)將 fruits 列表轉(zhuǎn)換為一個(gè)枚舉對象,遍歷該對象時(shí),每個(gè)元素會被拆分成兩部分,一部分是索引,一部分是值。
輸出結(jié)果:
0apple 1banana 2cherry
在循環(huán)體內(nèi),我們可以使用 i 變量來訪問當(dāng)前元素的索引,使用 fruit 變量來訪問當(dāng)前元素的值。
zip(f1, f2) 是將兩個(gè)可迭代對象 f1 和 f2 中的對應(yīng)元素一一配對,生成一個(gè)新的迭代器;
在比較文件的過程中,zip() 函數(shù)可以用來同時(shí)遍歷兩個(gè)文件對象 f1 和 f2,逐行比較它們的內(nèi)容。
這里再額外提一個(gè)利用difflib 模塊進(jìn)行文件比對
使用 difflib 模塊進(jìn)行文件比對可以得到更詳細(xì)的文件差異信息。difflib 模塊提供了多種比對算法和函數(shù),可以用來比較文本文件、代碼文件等;
使用 difflib.HtmlDiff() 類來生成差異信息的 HTML 格式。
下面是一個(gè)示例代碼,它比對兩個(gè)文件并將差異信息以 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): #讀取兩個(gè)文件的內(nèi)容 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內(nèi)容寫入文件 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() 方法將文本轉(zhuǎn)換為行列表。
生成的 HTML 文件中,差異信息會以表格形式呈現(xiàn),每一行的左側(cè)顯示行號,右側(cè)顯示該行的內(nèi)容。
這種格式的輸出相對于純文本格式的輸出更容易閱讀和理解,特別是在需要比對較長文本時(shí),能夠提高比對效率和結(jié)果的準(zhǔn)確性。
審核編輯:劉清
-
HTML
+關(guān)注
關(guān)注
0文章
278瀏覽量
35213 -
python
+關(guān)注
關(guān)注
56文章
4792瀏覽量
84628
原文標(biāo)題:Python進(jìn)行文件比對
文章出處:【微信號:數(shù)字ICer,微信公眾號:數(shù)字ICer】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論