Python 比较包含数据组的两个文本文件

Python 比较包含数据组的两个文本文件,python,file,compare,Python,File,Compare,我有两个包含数据组的文本文件。这些组由4行数据组成,每个组之间有一个空格。我试图将文件1中的集合与文件2中的集合进行比较,然后提取文件2中未找到的集合;但是,我不知道如何保存这些数据,以便他们分组。这是数据外观的一个示例: Data 1 Data 2 Number 1 Number 2 Data 1 Data 2 Number 1 Number 2 它重复着。以下是我到目前为止的情况: f1 = open("file 1.txt","r").readlines() f2 = open("fi

我有两个包含数据组的文本文件。这些组由4行数据组成,每个组之间有一个空格。我试图将文件1中的集合与文件2中的集合进行比较,然后提取文件2中未找到的集合;但是,我不知道如何保存这些数据,以便他们分组。这是数据外观的一个示例:

Data 1
Data 2
Number 1
Number 2

Data 1
Data 2
Number 1
Number 2
它重复着。以下是我到目前为止的情况:

f1 = open("file 1.txt","r").readlines()
f2 = open("file 2.txt","r").readlines()

diff = set(f1) - set(f2)
print diff 
outFile = open("output.txt","w")
outFile.writelines(line for line in f1 if line in diff)

听起来您试图比较两个文件之间的行组,而不仅仅是文件中的行。在这种情况下,您需要自己将这些行组合在一起,然后像以前一样进行比较。假设组之间总是有一个空行(如您所发布的),下面的代码将读取其中一个文件。行上应该仍然有
\n
,因此打印出最终数据不需要任何特殊格式

allLines = open("file1.txt", 'r').readlines()

# this is the array you'll want to compare with
groupedLines = []
gLine = ""

for line in allLines:
    # whenever you get a blank line, put the grouped line in the array
    # and clear the grouped line
    if line == "":
        groupedLines.append(gLine)
        gLine = ""
    gLine += line

# don't forget to save the last grouping
groupedLines.append(gLine)

这应该行得通。但是,如果您的问题开始变得更加复杂,可能需要更复杂的解析器

text1 = """
Data 1
Data 2
Number 1
Number 2

Data 1
Data 2
Number 5
Number 6
"""

text2 = """
Data 1
Data 2
Number 1
Number 2

Data 1
Data 2
Number 3
Number 4
"""

from itertools import izip_longest
def grouper(iterable, n, fillvalue=None):
    """recipe from itertools docs"""
    "Collect data into fixed-length chunks or blocks"
    # grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx
    args = [iter(iterable)] * n
    return izip_longest(fillvalue=fillvalue, *args)

def line_group(text):
    """remove empty lines, and split per 4"""
    return grouper((line for line in text.splitlines() if line), 4)

print set(line_group(text1)) - set(line_group(text2))

是否要查找文件1中不存在的行,然后查找要写入output.txt的行?我要查找文件2中不存在的行,然后将其写入outfile。现在发生的事情是,这些行将被提取,但它们不会在同一个数据集中保持在一起。我有一些东西,但我没有用集合来做,你想看看吗?你试过difflib吗?那太好了!谢谢你,T.C。!列表不能很好地使用优雅的基于集合的组减法。最好立即将组创建为可散列元组。