python筆記系列:檔案內容、檔案及檔案夾的對比difflib、filecmp__python

來源:互聯網
上載者:User
檔案內容對比 #!/usr/bin/python import difflib text1 = """text1: This module provides classes and functions for comparing sequences. including HTML and context and unified diffs. difflib document v7.4 add string """ text1_lines = text1.splitlines() text2 = """text2: This module provides classes and functions for Comparing sequences. including HTML and context and unified diffs. difflib document v7.5""" text2_lines = text2.splitlines() d = difflib.Differ() diff = d.compare(text1_lines, text2_lines) print '\n'.join(list(diff))
對比符號含義說明 ‘-’ 第一個序列有,第二個無 ‘+’ 第一個序列無,第二個有 ‘ ’ 兩個一致 ‘?’ 兩序列存在增量差異 '^' 標誌出兩序列的差異字元
採用HtmlDiff()類的make_file()方法可產生美觀的HTML文檔 上述樣本的以下部分 d = difflib.Differ() diff = d.compare(text1_lines, text2_lines) print '\n'.join(list(diff)) 替換為 d = difflib.HtmlDiff() print d.make_file(text1_lines, text2_lines) 檔案命名為simple2.py,執行 python simple2.py > diff.html,可產生對比檔案
Nginx設定檔對比 #!/usr/bin/python # coding=UTF-8 import difflib import sys try: textfile1=sys.argv[1] #第一個檔案路徑參數 textfile2=sys.argv[2] #第二個檔案路徑參數 except Exception,e: print "Error:"+str(e) print "Usage: simple3.py filename1 filename2" sys.exit() def readfile(filename): try: fileHandle = open (filename, 'rb' ) text=fileHandle.read().splitlines() fileHandle.close() return text except IOError as error: print('Read file Error:'+str(error)) sys.exit() if textfile1=="" or textfile2=="": print "Usage: simple3.py filename1 filename2" sys.exit() text1_lines = readfile(textfile1) text2_lines = readfile(textfile2) d = difflib.HtmlDiff() print d.make_file(text1_lines, text2_lines)
檔案執行:python simple3.py nginx.conf.v1 nginx.conf.v2 > diff.html
檔案與目錄差異對比 filecmp模組的三個操作方法 cmp 單檔案對比 cmpfiles 多檔案對比 dircmp 目錄對比
filecmp.cmp(f1,f2[,shallow]) 對比檔案f1、f2,相同返回True,否則False, shallow預設為True,只根據os.stat()方法返回的檔案基本資料對比,如最後訪問時間、修改時間、狀態改變時間等 shallow為False時,則os.stat()、檔案內容同時進行校正 >>> import filecmp >>> filecmp.cmp("/root/test/a","/root/test/b") False >>> filecmp.cmp("/root/test/a","/root/test/a") True filecmp.cmpfiles(dir1,dir2,common[,shallow]),該方法返迴文件名的三個列表,分別為匹配、不匹配、錯誤,錯誤清單包括目錄不存在檔案、不具備讀寫權限或其他原因導致的不能比較的檔案清單 >>>filecmp.cmpfiles("/root/test/dir1","/root/test/dir2",['f1','f2','f3','f4','f5']) (['f1','f2'],['f3'],['f4','f5']) filecmp.dircmp(a,b[,ignore[,hide]]) ignore代表檔案名稱忽略的列表,預設為['RCS','CVS','tags'] hide代表隱藏的列表,預設為[os.curdir,os.pardir] dircmp支援遞迴,提供三個輸出報告的方法: report() #比較目錄中的內容 report_partial_closure() #比較目錄及其第一級子目錄中的內容 report_full_closure() #遞迴比較所有指定目錄的內容 dircmp類提供一下屬性: left 左目錄 right 右目錄 left_list 左目錄中的檔案及目錄 right_list 右目錄中的檔案及目錄 common 左右共有的檔案及目錄 left_only 只在左目錄有的檔案或目錄 right_only 只在右目錄有的檔案或目錄 common_dirs 兩邊都有的子目錄 common_files 兩邊都有的子檔案 common_funny 兩邊都有的子目錄(不同目錄類型或os.stat()記錄的錯誤) same_files 匹配相同的檔案 diff_files 不匹配的檔案 funny_files 兩邊都有但無法比較的檔案 subdirs 將common_dirs目錄名映射到新的dircmp對象,格式為字典類型
通過dircmp()實現目錄差異對比,同時輸出目錄對比對象所有屬性資訊 import filecmp a="/home/test/filecmp/dir1" b="/home/test/filecmp/dir2" dirobj=filecmp.dircmp(a,b,['test.py']) #ignore test.py print "-------------------report---------------------" dirobj.report() print "-------------report_partial_closure-----------" dirobj.report_partial_closure() print "-------------report_full_closure--------------" dirobj.report_full_closure() print "left_list:"+ str(dirobj.left_list) print "right_list:"+ str(dirobj.right_list) print "common:"+ str(dirobj.common) print "left_only:"+ str(dirobj.left_only) print "right_only:"+ str(dirobj.right_only) print "common_dirs:"+ str(dirobj.common_dirs) print "common_files:"+ str(dirobj.common_files) print "common_funny:"+ str(dirobj.common_funny) print "same_file:"+ str(dirobj.same_files) print "diff_files:"+ str(dirobj.diff_files) print "funny_files:"+ str(dirobj.funny_files)
校正源與備份目錄差異,並增量備份 使用filecmp模組的left_only、diff_files 遞迴擷取來源目錄的更新項,再通過shutil.copyfile、os.makedirs方法對更新項進行複製,最終保持一致狀態 #!/usr/bin/env python # coding=UTF-8 import os, sys import filecmp import re import shutil holderlist=[] def compareme(dir1, dir2): #遞迴擷取更新項函數 dircomp=filecmp.dircmp(dir1,dir2) only_in_one=dircomp.left_only #來源目錄新檔案或目錄 diff_in_one=dircomp.diff_files #不匹配檔案,來源目錄檔案已發生改變 dirpath=os.path.abspath(dir1) #定義來源目錄絕對路徑 #將更新檔案名稱或目錄追加到holderlist [holderlist.append(os.path.abspath( os.path.join(dir1,x) )) for x in only_in_one] [holderlist.append(os.path.abspath( os.path.join(dir1,x) )) for x in diff_in_one] if len(dircomp.common_dirs) > 0: #判斷是否存在相同子目錄,以便遞迴 for item in dircomp.common_dirs: #遞迴子目錄 compareme(os.path.abspath(os.path.join(dir1,item)), \ os.path.abspath(os.path.join(dir2,item))) #“\”為換行串連符 #return holderlist #原代碼 return holderlist #修正後,未對齊該函數可能返回none,導致程式報錯 #注意代碼對齊,空格和tab不能混用。。
def main(): if len(sys.argv) > 2: #要求輸入來源目錄和備份目錄 dir1=sys.argv[1] dir2=sys.argv[2] else: print "Usage: ", sys.argv[0], "datadir backupdir" sys.exit() source_files=compareme(dir1,dir2) #對比來源目錄和備份目錄 dir1=os.path.abspath(dir1)
if not dir2.endswith('/'): dir2=dir2+'/' #備份目錄路徑加“/” dir2=os.path.abspath(dir2) destination_files=[] createdir_bool=False for item in source_files: #遍曆返回的差異檔案或目錄清單 destination_dir=re.sub(dir1, dir2, item) #將來源目錄差異路徑清單對應替換成備份目錄 destination_files.append(destination_dir) if os.path.isdir(item): #如果差異路徑為目錄且不存在,則在備份目錄中建立 if not os.path.exists(destination_dir): os.makedirs(destination_dir) createdir_bool=True #再次調用compareme函數標記
if createdir_bool: #重新調用compareme函數,重新遍曆新建立目錄的內容 destination_files=[] source_files=[] source_files=compareme(dir1,dir2) #調用compareme函數 for item in source_files: #擷取來源目錄差異路徑清單,對應替換成備份目錄 destination_dir=re.sub(dir1, dir2, item) destination_files.append(destination_dir)
print "update item:" print source_files #輸出更新列表清單 copy_pair=zip(source_files,destination_files) #將來源目錄與備份目錄檔案清單拆分成元組 for item in copy_pair: if os.path.isfile(item[0]): #判斷是否為檔案,是則進行複製操作 shutil.copyfile(item[0], item[1]) if __name__ == '__main__': main()
檔案內容對比 #!/usr/bin/python import difflib text1 = """text1: This module provides classes and functions for comparing sequences. including HTML and context and unified diffs. difflib document v7.4 add string """ text1_lines = text1.splitlines() text2 = """text2: This module provides classes and functions for Comparing sequences. including HTML and context and unified diffs. difflib document v7.5""" text2_lines = text2.splitlines() d = difflib.Differ() diff = d.compare(text1_lines, text2_lines) print '\n'.join(list(diff))
對比符號含義說明 ‘-’ 第一個序列有,第二個無 ‘+’ 第一個序列無,第二個有 ‘ ’ 兩個一致 ‘?’ 兩序列存在增量差異 '^' 標誌出兩序列的差異字元
採用HtmlDiff()類的make_file()方法可產生美觀的HTML文檔 上述樣本的以下部分 d = difflib.Differ() diff = d.compare(text1_lines, text2_lines) print '\n'.join(list(diff)) 替換為 d = difflib.HtmlDiff() print d.make_file(text1_lines, text2_lines) 檔案命名為simple2.py,執行 python simple2.py > diff.html,可產生對比檔案
Nginx設定檔對比 #!/usr/bin/python # coding=UTF-8 import difflib import sys try: textfile1=sys.argv[1] #第一個檔案路徑參數 textfile2=sys.argv[2] #第二個檔案路徑參數 except Exception,e:
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.