Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Python中区分两个文本文件并忽略空白和空行?_Python_Diff - Fatal编程技术网

如何在Python中区分两个文本文件并忽略空白和空行?

如何在Python中区分两个文本文件并忽略空白和空行?,python,diff,Python,Diff,我可以使用Gnudiff命令和开关成功地比较两个文件:--忽略所有空格 我现在想用Python做同样的事情,但没有发现任何可行的方法。我在StackOverflow上读过其他文章,建议如何操作,但没有一篇有效 我不认为人们在发帖前会亲自尝试证明一个建议是有效的 如果有人在Python中忽略了空格/空行,成功地对两个文件进行了区分,请发布,这对我和其他许多人都是非常有帮助的 在python中,我从filecmp import cmp导入,并使用以下行: is_match=cmp(file1,fi

我可以使用Gnu
diff
命令和开关成功地比较两个文件:
--忽略所有空格

我现在想用Python做同样的事情,但没有发现任何可行的方法。我在StackOverflow上读过其他文章,建议如何操作,但没有一篇有效

我不认为人们在发帖前会亲自尝试证明一个建议是有效的


如果有人在Python中忽略了空格/空行,成功地对两个文件进行了区分,请发布,这对我和其他许多人都是非常有帮助的

在python中,我从filecmp import cmp导入
,并使用以下行:


is_match=cmp(file1,file2)

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

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!!!!
使用此技术只需将每个文件的内容读入一个字符串,如
text1
text2
所示

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

如果您可以假设两个文件的行匹配,并且两个文件之间的任何差异仅在每行级别上,那么您可以迭代两个文件并逐行比较,从而将内存需求降至几乎为零。您仍然可以使用此处显示的技术来比较每一行

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

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

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

您能否提供指向其他SO文章的链接,这些文章对您不起作用?这是否回答了您的问题@托梅里库——我认为这个问题在这里不适用。它讨论忽略包含特定内容的行,而不是空行。如果两个文件之间的唯一区别是空格,则您应该能够将两个文件作为字符串读入内存,然后对每个文件应用正则表达式,用单个空格替换空白组。完成此操作后,应该可以使用
==
@Steve比较这两个字符串有什么区别?内容是。。。。没有什么被接受的答案实际上非常一般,这里的谓词函数可以是
return bool(line.strip())
。。。这意味着空行将返回
False
,并被忽略。您的
re
方法效率很低,尤其是当文件非常大时。这对于这些示例字符串都很好,但如果您有两个非常大的文件,则效率很低,将两个内容保存为一个字符串,操纵它们,然后比较它们…@Tomerikoo我不同意这里存在明显的低效率。此外,我不认为有任何方法可以在不使用大量技巧的情况下将文件存储到内存中,假设“忽略空白”意味着这两个文本可以根据每行上出现的内容进行不同的分解。在那种情况下,逐行比较是行不通的。这种方法确实占用了大量内存,但现在内存相对丰富。我打赌我们所有的机器都至少有8GB。我会毫不犹豫地使用此算法来比较大小甚至只有几十兆字节的文件。@Tomerikoo-请参阅我答案中的补充内容。它们应该解决您向读者指出的逐行技术的适当性,以及效率和内存使用问题。