我有两个包含数据组的文本文件。这些组由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)
答案 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))