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瀏覽量
34497 -
python
+關注
關注
56文章
4782瀏覽量
84460
原文標題:Python進行文件比對
文章出處:【微信號:數字ICer,微信公眾號:數字ICer】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論