【发布时间】:2017-12-07 05:28:25
【问题描述】:
我想在 Python 中比较两个文本文件,并返回不同的行。我的尝试使用 difflib,但我愿意接受其他建议。我需要获取不同的行,以及出现在一个文件中但不在另一个文件中的行。顺序有点重要,但如果存在不考虑顺序的好的解决方案,我可以放弃它。
问题是一个文件的行包含多个尾随字符\t 和\n,而另一个没有;我不想将其视为差异。对于其他文件,第一个文件只有\n,其他文件末尾有\t 字符。这些行包含由制表符或空格分隔的元素,因此它们很重要;我只是不关心尾随字符\t 和\n。
我的解决方案:
from difflib import Differ
with open(file_path) as actual:
with open(test_file_path) as test:
differ = Differ()
for line in differ.compare(actual.readlines(), test.readlines()):
if line.startswith('-'):
log.error('EXPECTED: {}'.format(line[2:]))
if line.startswith('+'):
log.error('TEST FILE: {}'.format(line[2:]))
当存在差异时,我希望输出显示 EXPECTED 和 TEST FILE 行,并且当一个包含一行而另一个不包含时,只显示 EXPECTED 或仅 TEST FILE。现在,我看到很多以下类型的错误:
00:02:40: ERROR EXPECTED: Issuer Type OBal Net WAC OTerm WAM Age GrossCpn HighRemTerm Grp
00:02:40: ERROR TEST FILE: Issuer Type OBal Net WAC OTerm WAM Age GrossCpn HighRemTerm Grp
如您所见(如果您突出显示它),第一行在“Grp”之后包含许多空格,而另一行则没有。我想将这两行视为相同。
我尝试明确指定制表符和换行符:
actual_file = actual.readlines()
expected_file = []
for line in actual_file:
if line[-1] == '\n':
expected_file.append(line.rstrip('\n').rstrip('\t') + '\n')
else:
expected_file.append(line.rstrip('\t'))
但是,它 (a) 会大大减慢处理速度,并且 (b) 每种文件类型都需要以不同的方式,因为有些文件有尾随制表符后跟换行符,有些文件只有换行符,并且有些什么都没有。如果没有更好的方法,我可以删除每个尾随制表符和换行符的每一行,但对于似乎很容易解决的问题,这似乎需要很大的处理能力(我必须运行很多文件)。
【问题讨论】:
-
考虑删除行中的尾随空格。
-
@lamandy 我可能会混淆一切,但如果我在
for line in differ....语句之后删除行中的尾随空格,它不会做任何事情,因为不同已经认为这些行由于尾随而不同空间。这是不正确的吗?我想我可以逐行重新创建原始文件,删除尾随空格,但这似乎效率低下。 -
不是直接将行传递给不同,而是在传递给不同之前处理它们以删除尾随空格
-
对...在您最初发表评论后,我一直在努力解决这个问题,但遇到了两个问题:(1)它让整个事情变慢了很多。可管理,但引人注目。 (2) 在浏览其余文件时,我注意到在某些情况下,第一个文件有类似 '\t\t\t\t\t\t\n' 而第二个文件有 '\ n',在其他情况下,第一个文件只有'\n',而第二个文件有'\t\t\t\n',依此类推。理想情况下,我想传递尾随字符以忽略,即 \t 和 \n。我将修改问题以反映这一点。
-
您可能正在尝试解决一个过于复杂的琐碎问题。
标签: python python-2.7 difflib