有没有办法在另一个文件中查找一个文件中的单词,并在新文件中输出另一个文件中找不到的单词?



我正在尝试比较Python中的两个文件,它们都包含一些单词。我希望代码在 file1 中查找 file2 中的单词,并将从 file1 中找不到的单词作为输出放入新文件中。

下面的代码是我尝试过的,但它没有做任何事情。它甚至没有显示错误,所以我不知道出了什么问题或应该有所不同。

file1 = open('C:/Users/Atal/Desktop/School/Project datas/file1.txt')
file2 = open('C:/Users/Atal/Desktop/School/Project datas/file2.txt')
fileContent = file1.read();
fileContent2 = file2.read();
loglist = file1.readlines()
loglist2 = file2.readlines()
file2.close()
line = file1.readline()
file1.close()
found = False
for line in loglist:
if line in loglist2 :
found = True
if not found:
file1 = open('C:/Users/Atal/Desktop/School/Project datas/file1.txt', 'w')
file1.write(line +"n")
file1.close()

文件1如下所示: 彼得 一月 理查

File2 如下所示: 弗洛伊德 理查 鲍勃

新文件应如下所示: 彼得 一月

如果有任何方法可以做到这一点,请告诉我。提前谢谢。

使用 set 而不是这样:

list_1 = ['Peter', 'Jan', 'Richard']
list_2 = ['Floyd', 'Richard', 'Bob'] 
set_2 = set(list_2)  
main_list = [item for item in list_1 if item not in set_2]
main_list

输出:

['Peter', 'Jan']

在编写代码时,您需要准确记住您希望每个变量在程序执行的每一步包含的内容。例如,这个:

loglist = file1.readlines()
...
line = file1.readline()
...
for line in loglist:

如果你只是要立即覆盖line,为什么要做中间的陈述?在您的for循环中:

for line in loglist:
if line in loglist2:
found = True
if not found:
# save new file

因此,如果在loglist2中找到loglist中的一行,则将变量found设置为True。如果这没有发生(如果found保持False),则输出到 file1。请注意,您没有对line做任何其他事情,即使您是,该行也file1.write(line +"n")只输出一行,并且永远不会与其他行重复(或者我从您在问题中缩进代码的方式推测)。


因此,这是您如何更正确地执行此操作。在阅读本文时,请注意每个变量在使用时的类型(字符串、列表等):

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

@johnny1995,在他的回答中,做了列表理解的中间步骤:

logList3 = [line for line in logList2 if line not in logList1]

这基本上是我上面所做的简写:"创建一个包含logList2中每一行的新列表,但前提是该行没有出现在logList1中"。

相关内容

最新更新