我想比较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)以不同的方式对每种文件类型都是必需的,因为有些文件有尾随制表符后跟换行符,有些文件只有换行符,并且有些人什么都没有。如果没有更好的方法,我可以删除每个尾随选项卡和换行符的每一行,但似乎很多处理能力(我必须运行大量文件)似乎很容易解决。
答案 0 :(得分:0)
在这里查看string.rstrip()
:https://docs.python.org/2/library/string.html#string.rstrip
string.rstrip()
应该通过从字符串末尾删除空格来完成所需的操作,同时在结束之前留下\ t和\ n字符。
检查出来:
>>> import string
>>> s = "This \t is \t a \t line \t\t\t\n\n\n"
>>> print(s)
This is a line
>>>
>>> s = string.rstrip(s)
>>> s
'This \t is \t a \t line'
>>> print(s)
This is a line
>>>
希望这有帮助!