两个文件之间的不同行,当一行包含尾随空格时(Python,difflib)

时间:2017-12-07 05:28:25

标签: python python-2.7 difflib

我想比较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)以不同的方式对每种文件类型都是必需的,因为有些文件有尾随制表符后跟换行符,有些文件只有换行符,并且有些人什么都没有。如果没有更好的方法,我可以删除每个尾随选项卡和换行符的每一行,但似乎很多处理能力(我必须运行大量文件)似乎很容易解决。

1 个答案:

答案 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
>>>

希望这有帮助!