2013-11-21 53 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)从 元件

返回ř长度的子序列输入可迭代。

组合按字典顺序排列。因此,如果 输入可迭代排序,则 组合元组将以 排序顺序生成。