<p>基于行为,<code>file2.txt</code>不会以换行符结尾,因此<code>lines2</code>的内容是<code>['Man\n', 'Dog\n', 'Axe\n', 'Cat']</code>。注意<code>'Cat'</code>缺少换行符。你知道吗</p>
<p>我建议你规范化你的台词,这样他们就不会有新词了,换成:</p>
<pre><code>lines1 = newLines.readlines()
lines2 = originalLines.readlines()
</code></pre>
<p>使用:</p>
<pre><code>lines1 = [line.rstrip('\n') for line in newLines]
# Set comprehension makes lookup cheaper and dedupes
lines2 = {line.rstrip('\n') for line in originalLines}
</code></pre>
<p>和变化:</p>
<pre><code>output.write(line)
</code></pre>
<p>收件人:</p>
<pre><code>print(line, file=output)
</code></pre>
<p>这将为您添加新行。实际上,最好的解决方案是完全避免内部循环,改变所有这些:</p>
<pre><code>for line2 in lines2:
if line == line2:
duplicate = True
break
if duplicate == False:
output.write(line)
else:
duplicate = False
</code></pre>
<p>只是:</p>
<pre><code>if line not in lines2:
print(line, file=output)
</code></pre>
<p>如果像我建议的那样使用<code>set</code>来表示<code>lines2</code>,那么测试的开销将从<code>file2.txt</code>中的线性行数下降到大致恒定的值,而不管<code>file2.txt</code>的大小(只要唯一行的集合可以完全放入内存中)。你知道吗</p>
<p>更好的方法是,对打开的文件使用<code>with</code>语句,并流式处理<code>file1.txt</code>,而不是将其保存在内存中,最终得到:</p>
<pre><code>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)
</code></pre>