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

时间:2014-01-10 17:41:38

标签: 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("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)

2 个答案:

答案 0 :(得分:0)

听起来你正在尝试比较两个文件之间的行组,而不仅仅是文件中的行。在这种情况下,您需要自己将线组合在​​一起,然后按照您的方式进行比较。假设组之间总是有一个空行(如您所发布的那样),下面会读取其中一个文件。这些行应该仍然有\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)

答案 1 :(得分:0)

这应该有效。但是,如果你的问题开始变得更加复杂,也许可能需要一个更复杂的解析器。

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