【问题标题】:Different lines between two files, when one line contains trailing whitespace (Python, difflib)两个文件之间的不同行,当一行包含尾随空格时(Python,difflib)
【发布时间】: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


【解决方案1】:

在这里查看string.rstrip()https://docs.python.org/2/library/string.html#string.rstrip

检查一下:

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

希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多