<p>在编写代码时,您需要准确地记住在程序执行的每个步骤中每个变量所包含的内容。例如:</p>
<pre><code>loglist = file1.readlines()
...
line = file1.readline()
...
for line in loglist:
</code></pre>
<p>如果要立即覆盖<code>line</code>,为什么要使用中间语句呢?在<code>for</code>循环中:</p>
<pre><code>for line in loglist:
if line in loglist2:
found = True
if not found:
# save new file
</code></pre>
<p>因此,如果在<code>loglist2</code>中找到了来自<code>loglist</code>的行,那么将变量<code>found</code>设置为<code>True</code>。而<em>如果没有发生</em>(如果<code>found</code>仍然<code>False</code>),则输出到file1。请注意,您没有对<code>line</code>做任何其他操作,即使您做了,行<code>file1.write(line +"\n")</code>也只输出一行,从不与其他行重复(或者我从您在问题中缩进代码的方式推测)</p>
<hr/>
<p>所以,这里是你如何做得更正确。在阅读本文时,请注意每个变量在使用时的类型(字符串、列表等):</p>
<pre><code>with open(".../file1.txt", "r") as file1, open(".../file2.txt", "r") as file2:
logList1 = file1.readlines()
logList2 = file2.readlines()
# the with block will close the files automatically
for line in logList1:
if line in logList2:
logList2.remove(line) # if the line from file1 is found in file2, remove that line from file2
with open(".../file3.txt", "w") as file3:
file3.writelines(logList2) # write the contents of file2, after we removed lines from file1 from it
</code></pre>
<p>@johny1995,在他的回答中,做了列表理解的中间一步:</p>
<pre><code>logList3 = [line for line in logList2 if line not in logList1]
</code></pre>
<p>这基本上是我上面所做工作的简写:“创建一个包含<code>logList2</code>中每一行的新列表,但前提是该行没有出现在<code>logList1</code>”</p>