[英]Compare two text files to find differences and output them to a new text file
我正在尝试一个简单的数据比较文本文档。 目标是使用户能够选择一个文件,在该文件中搜索某个参数,然后将这些参数与具有默认值的文本文档进行比较,然后将这些参数打印到新的文本文档中。参数,然后将它们进行比较以将差异打印到新的文本文档中。
我创建了一个简单的流程图对此进行了总结:
这是我当前的代码。 我正在使用diff lib比较两个文件。
import difflib
from Tkinter import *
import tkSimpleDialog
import tkMessageBox
from tkFileDialog import askopenfilename
root = Tk()
w = Label(root, text ="Configuration Inspector")
w.pack()
tkMessageBox.showinfo("Welcome", "This is version 1.00 of Configuration Inspector")
filename = askopenfilename() # Logs File
filename2 = askopenfilename() # Default Configuration
compareFile = askopenfilename() # Comparison File
outputfilename = askopenfilename() # Out Serial Number Configuration from Logs
with open(filename, "rb") as f_input:
start_token = tkSimpleDialog.askstring("Serial Number", "What is the serial number?")
end_token = tkSimpleDialog.askstring("End Keyword", "What is the end keyword")
reText = re.search("%s(.*?)%s" % (re.escape(start_token + ",SHOWALL"), re.escape(end_token)), f_input.read(), re.S)
if reText:
output = reText.group(1)
fo = open(outputfilename, "wb")
fo.write(output)
fo.close()
diff = difflib.ndiff(outputfilename, compareFile)
print '\n'.join(list(diff))
else:
tkMessageBox.showinfo("Output", "Sorry that input was not found in the file")
print "not found"
到目前为止,结果是该程序可以正确搜索您选择的文件以供搜索,然后将找到的参数打印到新的输出文本文件中。
尝试比较两个文件(默认数据和输出文件)时会出现问题。
比较时,程序将输出差异,但是,由于默认数据文件的行与输出文件的行不同,因此它将仅打印出不匹配的行,而不打印不匹配的参数。 换句话说,我有两个文件:
默认数据文本文件:
Data1 = 1
Data2 = 2
Data3 = 3
Data4 = 4
Data5 = 5
Data6 = 6
输出数据文本文件:
Data1 = 1
Data2 = 2
Data3 = 8
Data4 = 7
因此,由于Data3和Data4与Match.txt文件(比较输出)不匹配,因此应显示该信息。 例如:
Data3 = 8
Data4 = 7
Data5 = 5
Data6 = 6
但是,它不匹配或不比较行,它只是检查该空间中是否有行。 所以目前我的比较输出看起来像这样:
Data5 = 5
Data6 = 6
关于如何进行比较的任何想法都可以显示文件参数之间的差异吗?
如果您需要更多详细信息,请在评论中让我知道,我将编辑原始帖子以添加更多详细信息。
我不知道您要使用difflib.ndiff()
做什么。 该函数接受两个字符串列表,但是您要传递文件名。
无论如何,这是一个简短的演示,可以执行所需的比较。 它使用dict
来加快比较过程。 显然,我没有您的数据文件,因此该程序使用字符串.splitlines()
方法创建字符串列表。
它逐行通过默认数据列表。
如果输出dict
不存在该数据,则将打印默认行。
如果输出dict
存在具有该值的数据键,那么将跳过该行。
如果找到了键,但是输出dict
中的值与默认值不同,则将打印包含键和输出值的行。
#Build default data list
defdata = '''
Data1 = 1
Data2 = 2
Data3 = 3
Data4 = 4
Data5 = 5
Data6 = 6
'''.splitlines()[1:]
#Build output data list
outdata = '''
Data1 = 1
Data2 = 2
Data3 = 8
Data4 = 7
'''.splitlines()[1:]
outdict = dict(line.split(' = ') for line in outdata)
for line in defdata:
key, val = line.split(' = ')
if key in outdict:
outval = outdict[key]
if outval != val:
print '%s = %s' % (key, outval)
else:
print line
产量
Data3 = 8
Data4 = 7
Data5 = 5
Data6 = 6
这是将文本文件读入行列表的方法。
with open(filename) as f:
data = f.read().splitlines()
还有一个.readlines()
方法,但是在这里不是那么有用,因为它在每行的末尾保留\\n
行字符,我们不希望这样。
请注意,如果文本文件中有任何空白行,则结果列表在该位置将有一个空字符串''
。 而且,该代码不会删除每行上的任何前导或尾随空格或其他空格。 但是,如果您需要这样做,那么有成千上万的示例可以向您展示如何在Stack Overflow上进行操作。
此新版本使用略有不同的方法。 它遍历在默认列表或输出列表中找到的所有键的排序列表。
如果仅在列表之一中找到键,则将相应的行添加到差异列表中。
如果在两个列表中都找到了一个键,但是输出行与默认行不同,则将输出列表中的相应行添加到差异列表中。 如果两行相同,则不向差异列表添加任何内容。
#Build default data list
defdata = '''
Data1 = 1
Data2 = 2
Data3 = 3
Data4 = 4
Data5 = 5
Data6 = 6
'''.splitlines()[1:]
#Build output data list
outdata = '''
Data1 = 1
Data2 = 2
Data3 = 8
Data4 = 7
Data8 = 8
'''.splitlines()[1:]
def make_dict(data):
return dict((line.split(None, 1)[0], line) for line in data)
defdict = make_dict(defdata)
outdict = make_dict(outdata)
#Create a sorted list containing all the keys
allkeys = sorted(set(defdict) | set(outdict))
#print allkeys
difflines = []
for key in allkeys:
indef = key in defdict
inout = key in outdict
if indef and not inout:
difflines.append(defdict[key])
elif inout and not indef:
difflines.append(outdict[key])
else:
#key must be in both dicts
defval = defdict[key]
outval = outdict[key]
if outval != defval:
difflines.append(outval)
for line in difflines:
print line
产量
Data3 = 8
Data4 = 7
Data5 = 5
Data6 = 6
Data8 = 8
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.