2013-05-15 4 views
0

У меня есть два файла, file1 содержит содержимое, каксравнить содержимое двух файлов, извлекая различное содержание в питоне

ааа

ГЭБА

ссса

и файл 2 содержит содержимое как

ссс

ддд

еее

ааа

ррр

ГЭБ

NNN

Я хотел бы сделать так, если фил e2 содержит строку file1, тогда эта строка будет удалена из файла2. В конце концов, file2 будет как ДДД еее ррр NNN Кроме того, мой код

f1 = open("test1.txt","r") 
f2 = open("test2.txt","r") 

    fileOne = f1.readlines() 
    fileTwo = f2.readlines() 
    f1.close() 
    f2.close() 
    outFile = open("test.txt","w") 
    x = 0 
    for i in fileOne: 
     if i != fileTwo[x]: 
      outFile.writelines(fileTwo[x]) 
     x += 1 

outFile.close() 

Спасибо.

+0

Я не думаю, что вы задали вопрос (нет, я вижу). Нам нужно знать, с чем вы хотите помочь нам. – SethMMorton

+0

Я скажу, что вы, вероятно, хотите 'outfile.write' вместо' outfile.writelines'. 'writelines' ожидает список строк, но вы, кажется, передаете только строку. – SethMMorton

+0

Сообщение с правильным отступом, пожалуйста. –

ответ

0

Используйте разницу в настройках, чтобы найти различия между двумя файлами.

f1 = open("test1.txt","r").readlines() 
f2 = open("test2.txt","r").readlines() 

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

Почему бы вам не перейти 'diff' непосредственно к сценариям, а не' строка для строки в f2, если строка в diff' – iruvar

+0

Линия «aaa» все еще выходит. Спасибо.Я хотел бы удалить строку, которая выходит из файла1. –

+0

наборы неупорядочены, а элементы в наборах уникальны. Если вывод должен оставаться упорядоченным или иметь дубликаты, используйте что-то вроде выше, в противном случае вы можете передать набор в сценарии писем – mtadd

0

Использование кода ...

f1 = open("test1.txt","r").read() 
f2 = open("test2.txt","r").read() 

fileOne = f1.splitlines() 
fileTwo = f2.splitlines() 

# remove the dup lines 
nodup_lines = [line for line in fileTwo if line not in fileOne] 
# join using newline character 
newFileTwo = '\n'.join(nodup_lines) 

# write file 
outFile = open("test.txt","w") 
outFile.write(newFileTwo) 
outFile.close() 
+0

Линия «aaa» все еще выходит. Благодарю. –

+0

Я хотел бы удалить строку, которая выходит из файла1. –

+0

Все три этих ответа должны работать на вас. Можете ли вы скопировать и прочесть точную копию файла. В файле должна быть указатель новой строки или какой-либо символ пробела. – b10hazard

4
with open("f1.txt") as f1: 
    s1 = set(f1) 
with open("f2.txt") as f2, open("f3.txt","w") as f3: 
    f3.writelines(x for x in f2 if x not in s1) 

Это хорошая практика, чтобы использовать менеджер контекста, чтобы закрыть файл (это то, что with делает).

Это гораздо более эффективным, чтобы проверить членство в set чем list

Если есть возможность дополнительного пробела, вы должны раздеться линии, как этот

with open("f1.txt") as f1: 
    s1 = set(x.strip() for x in f1) 
with open("f2.txt") as f2, open("f3.txt","w") as f3: 
    f3.writelines(x for x in f2 if x.strip() not in s1) 
+0

Ничего себе, гораздо лучше, чем мой ответ. +1 :) Быстрее! Хотя у меня создалось впечатление, что python закрывает файл во время сбора мусора, если он открыт только для чтения, верно? – b10hazard

+0

@Nater, файлы закрываются, когда собираются мусор, но это не всегда, как только они выходят за рамки - например, для jython. Лучше их очистить, чтобы вы не тратили ресурсы и не сталкивались с открытыми файлами. –

+0

Линия «aaa» все еще выходит. Спасибо.Я хотел бы удалить строку, которая выходит из файла1. –

Смежные вопросы