我已经编写了下面的代码来比较文件“(F)和我路径中的其他几个文件。现在结果只显示一个文件的结果。任何建议如何进行比较并打印所有文件结果?
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)
答案 0 :(得分:2)
diff_list
。
尝试附加到diff_list
而不是用这一行覆盖它:
diff_list = list(...)
答案 1 :(得分:1)
如果您只想比较文件,可以使用filecmp.cmp。它将避免使用readlines
读取所有内容。文档:
filecmp.cmp(f1,f2 [,浅])
比较名为f1和f2的文件, 如果它们看起来相等则返回True,否则返回False。
除非给出浅并且为false,否则具有相同os.stat()的文件 签名被认为是平等的。除非os.stat()签名发生更改,否则不会再次比较使用此函数进行比较的文件。请注意,此功能不会调用任何外部程序 它的便携性和效率。
另外,要探索所有可以使用itertools.combinations(r=2
}的文件组合:
itertools.combinations(iterable,r)
返回元素的r长度子序列 输入可迭代。
组合以字典排序顺序发出。所以,如果 输入iterable被排序, 组合元组将在 排序顺序。