Исходя из поведения, file2.txt
не заканчивается новой строкой, поэтому содержимое lines2
равно ['Man\n', 'Dog\n', 'Axe\n', 'Cat']
. Обратите внимание на отсутствие новой строки для 'Cat'
.
Я бы предложил нормализовать ваши строки, чтобы в них не было новых строк, заменив:
lines1 = newLines.readlines()
lines2 = originalLines.readlines()
с:
lines1 = [line.rstrip('\n') for line in newLines]
# Set comprehension makes lookup cheaper and dedupes
lines2 = {line.rstrip('\n') for line in originalLines}
и меняется:
output.write(line)
до:
print(line, file=output)
, который добавит новую строку для вас. Действительно, лучшее решение - полностью избежать внутреннего цикла, изменив все это:
for line2 in lines2:
if line == line2:
duplicate = True
break
if duplicate == False:
output.write(line)
else:
duplicate = False
просто:
if line not in lines2:
print(line, file=output)
, который, если вы используете set
для lines2
, как я предлагаю, делает стоимость падения теста линейной по количеству строк в file2.txt
до приблизительно постоянной независимо от размера file2.txt
( до тех пор, пока набор уникальных линий не умещается в памяти).
Еще лучше, используйте операторы with
для ваших открытых файлов и передайте file1.txt
вместо того, чтобы вообще хранить его в памяти, и вы получите:
with open("file2.txt") as origlines:
lines2 = {line.rstrip('\n') for line in origlines}
with open("file1.txt") as newlines, open("output.txt", "w") as output:
for line in newlines:
line = line.rstrip('\n')
if not line.isspace() and line not in lines2:
print(line, file=output)