2014-01-10 4 views
0

У меня есть два текстовых файла, содержащих группы данных. Группы организованы по 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

Вы хотите найти строки, которые не находятся в файле 1, а затем те строки, которые вы хотите записать в output.txt? – Oni1

+0

Я хочу найти строки, которые не находятся в файле 2, и написать их в outfile. То, что происходит, это линии, которые будут извлечены, но они не останутся вместе в одном наборе данных. – user2743902

+0

У меня есть что-то, но я не делал этого с наборами, хочу увидеть его? – Oni1

ответ

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

. Списки не будут хорошо сочетаться с изящным на основе набора методом вычитания групп. лучше сразу создать группы как хешируемые кортежи. –

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)) 
Смежные вопросы