如何在 Python 中对两个文本文件进行差异处理并忽略空格和空行?

问题描述

我可以使用 Gnu diff 命令和开关:--ignore-all-space 成功比较两个文件

我现在想在 Python 中做同样的事情,但没有找到任何可行的方法。我已经阅读了 StackOverflow 中其他建议如何操作的文章,但它们都不起作用。

我认为人们实际上不会在发布之前亲自尝试以证明建议有效。


如果有人成功地对两个文件进行了差异化,忽略了 Python 中的空格/空白行,请发帖,这对我和其他一些人最有帮助。

在 python 中,我正在导入 from filecmp import cmp,并使用这一行:

is_match = cmp(file1,file2)

解决方法

以下示例说明如何使用正则表达式和 strip 使两个仅包含空格差异的文本一致,以便进行比较:

text1 = """now is        the
time
for
all             good men to come to
the aid         of their country
"""

text2 = """now is the time for all good men to come to the aid of their country"""

import re

if (text1 == text2):
    print("YES!!!!")

text1 = re.sub(r'\s+',' ',text1).strip()
text2 = re.sub(r'\s+',text2).strip()

print(text1)
print(text2)

if (text1 == text2):
    print("YES!!!!")

结果:

now is the time for all good men to come to the aid of their country
now is the time for all good men to come to the aid of their country
YES!!!!

使用此技术所需要做的就是将每个文件的内容读入一个字符串,如此处由 text1text2 表示。

更新:此方法确实使用了大量内存,因为每个文件都必须完全读入内存。但是,如果在进行比较时要忽略行尾,那么我不确定如果没有大量涉及对内存中每个文本的部分进行花哨缓冲的技巧,您还能如何完成任务。但这里的“可观”并不一定意味着“值得担心”。对甚至数兆字节大小的文件使用这种技术应该不成问题。我希望大多数情况下会涉及更小的文本文件。肯定会出现这种技术需要被更复杂的技术取代的情况,因为内存效率是一个真正的问题。

如果您可以假设两个文件的行匹配,并且两个文件之间的任何差异仅在每行级别,那么您可以遍历两个文件并逐行比较它们,删除内存需求几乎为零。您仍然可以使用此处显示的技术来比较每一行。

作为测试,我使用在线 Lorum Ipsum 生成器生成此文件:

> ls -l /tmp/t1.txt
-rw-r--r--  1 steve  wheel  8430006 Jan 18 12:29 /tmp/t1.txt

我用这个 8+MB 文件的两个副本测试了所描述的技术。当我运行它时,我阅读和比较两个文件所花费的时间很明显,但不到一秒钟。我不知道以其他方式执行此任务是否可以避免这几百毫秒的执行时间。