2013-11-21 56 views
0

我寫了下面的代碼來比較一個文件「(F)與我的路徑中的其他幾個文件,現在結果只打印一個文件的結果,任何建議如何執行比較並打印所有結果?如何用Python比較一個文本文件和其他幾個文件?

import difflib 
import fnmatch 
import os 

filelist=[] 
f= open("D:/Desktop/data/sample/ff69c.txt") 
flines= f.readlines() 
path="D:/Desktop/data/sample/sample2" 
for root, dirnames, filenames in os.walk(path): 
    for filename in fnmatch.filter(filenames, '*.txt'): 
     filelist.append(os.path.join(root, filename)) 

for m in filelist: 
    g=open(m,'r') 
    glines= g.readlines() 
    # g.close() 
    d = difflib.Differ() 
    diff_list = list(d.compare(flines, glines)) 

#print("".join(diff)) 
n_adds, n_subs, n_eqs, n_wiered = 0, 0, 0, 0 

for diff_item in diff_list: 
    if diff_item[0] == '+': 
     n_adds += 1 
    elif diff_item[0] == '-': 
     n_subs +=1 
    elif diff_item[0] == ' ': 
     n_eqs += 1 
    else: 
     n_wiered += 1 

print 'lines files #1: %d #2: %d' % (len(flines), len(glines)) 
print 'adds: %d subs: %d eqs: %d ?:%d ' % (n_adds, n_subs, n_eqs, n_wiered) 

回答

2

diff_list被覆蓋與讀取每個文件

嘗試追加到diff_list而不是與這條線覆蓋它。

diff_list = list(...) 
1

如果你只是想比較您可以使用的文件filecmp.cmp。它將避免必須閱讀readlines中的所有內容。文檔:

filecmp.cmp(F1,F2 [淺])

比較名爲F1 文件和f2,返回true,如果他們似乎相等,否則返回False。

除非給出淺度並且爲假,否則採用相同os.stat() 簽名的文件相等。使用此函數進行比較的文件將不會再次進行比較,除非它們的os.stat()簽名發生更改。請注意,此功能不會調用外部程序,因此它具有便攜性和效率。

另外探索所有可以使用itertools.combinations(與r=2)文件組合:

itertools.combinations(可迭代,R)從 元件

返回ř長度的子序列輸入可迭代。

組合按字典順序排列。因此,如果 輸入可迭代排序,則 組合元組將以 排序順序生成。