Python 比较2个txt文件,并根据1或2个文件中缺少的内容创建一个新的txt文件

Python 比较2个txt文件,并根据1或2个文件中缺少的内容创建一个新的txt文件,python,list,loops,Python,List,Loops,我有两个txt文件,一个是水果列表,另一个是许多数据的列表,每行中嵌入一个水果,如下所示: 文件1: apple orange grape banana pear 文件2 Brian b7890 apple orchard autumn Sue c7623 grape vineyard summer Richard z4501 grapefruit citrusGrove autumn Mary m8123 pear orchard autumn 我需要从文件2中提取行,其中对应的结果没有出

我有两个txt文件,一个是水果列表,另一个是许多数据的列表,每行中嵌入一个水果,如下所示:

文件1:

apple
orange
grape
banana
pear
文件2

Brian b7890 apple orchard autumn
Sue c7623 grape vineyard summer
Richard z4501 grapefruit citrusGrove autumn
Mary m8123 pear orchard autumn
我需要从文件2中提取行,其中对应的结果没有出现在文件1中,并将其写入一个新的文本文件中。文件2示例中唯一符合标准的行是:

Richard z4501 grapefruit citrusGrove autumn
请注意:我给出这个例子是因为文件1中出现的单词“grape”是单词grapefrait的一部分,它排除了一些更简单的提取方法

我首先将每个文件的每一行放入列表:

f = open('ListOfFruits.txt')
listOfFruits = [line.strip() for line in open('ListOfFruits.txt')]
f.close()

a = open('AllFruitData.txt')
AllFruitData = [line.strip() for line in open('AllFruitData.txt')]
a.close()

i=0
x=0

while x < len(listOfFruits):
    if listOfFruits[i] not in allFruitData[x]:
        i=i+1
        #then check against allFruitData again
        #continue until the end of listOfFruits
        #if no match is found then add the line allFruitData[x] to a new txt file
   x=x+1  
f=open('listofruits.txt')
Listofruits=[line.strip()表示打开的行('listofruits.txt')]
f、 关闭()
a=打开('AllFruitData.txt'))
AllFrootData=[line.strip()用于打开的行('AllFrootData.txt')]
a、 关闭()
i=0
x=0
而x

我尝试过使用for循环、while循环和if语句的各种方法,但似乎总是被语法卡住。我试着想象代码工作时,两个轮子相互旋转,而一个静止,另一个一直旋转,直到找到匹配。如果找到匹配项,则固定轮将在1位置移动,移动轮将复位。如果静止的车轮在移动的车轮上找不到匹配的车轮,那么这段数据将进入一个新的篮子。这将一直持续,直到移动车轮穿过固定车轮上的所有位置。

使用
set
s怎么样。然后你可以使用。一个简单的实现可以是(如果水果总是在第二个文件的每一行的第三位)


编辑:

如果水果可以出现在任何列中,那么如果您不知道哪些单词是水果,这个问题就更加困难了。但是,如果您只想打印出不包含任何命名水果的行,这也不太糟糕:

with open('listOfFruits.txt', 'r') as f:
    fruits = set([line.rstrip() for line in f])

with open('outfile.txt', 'w') as outf, open('allFruitData.txt', 'r') as inf:
    for line in inf:
        words = set(line.rstrip().split())
        # you can replace this `if` with `if fruits & words == set()`
        if not fruits & words:
            outf.write(line)
它的作用是首先将所有的水果作为一个集合来阅读。然后,对于数据文件中的每一行,我们测试该行中的任何单词是否在结果集中。如果交叉点为空,则将该行打印到输出文件。如果行中某处包含水果,则继续下一行

请注意,这不会将
'grape'
'grapefrait'
匹配,因为它会根据您选择的任何分隔符(看起来像空格或
\t
)分割行。

这应该可以完成此工作(假设文件2中的水果始终是第三项):


因此,对于文件2中的每一个水果,如果它没有出现在文件1中,您想将其写入一个新文件吗?如果您这样做不是出于教育目的,那么您应该知道您正在重新发明(如果您至少用换行符替换空白)。你应该澄清你是想帮助理解你的算法还是仅仅实现你的目标(有更快、更简单的方法,比如使用集合)谢谢大家,是的,图腾就是这样,尽管是文件2中的整行。goncalopp我希望两者都能做到。我对写代码很陌生。这不是出于教育目的,我的实际文件与水果无关,但它可以作为一个很好的例子来解释我的问题。谢谢你的帮助,不幸的是,在文件2中,水果可能出现在我的实际文件的12-15列中的任何一列中。一个真正的解决方案是,如果您有一个文件或文件1和文件2中可能遇到的所有水果名称的列表。你能在这里做些什么吗?这会使事情变得容易。。我最初的帖子对此有一个解决方案。我的意思是,你能真正遇到多少水果?听起来如果我有这样一个清单,它可以工作。不幸的是,我的实际数据不是水果,为了简单起见,我只是以水果为例。比尔的最后一次编辑现在解决了这个问题,不过还是要谢谢你!感谢您的帮助,不幸的是,在文件2中,水果可以出现在我实际文件的12-15列中的任何列中
with open('listOfFruits.txt', 'r') as f:
    fruits = set([line.rstrip() for line in f])

with open('outfile.txt', 'w') as outf, open('allFruitData.txt', 'r') as inf:
    for line in inf:
        words = set(line.rstrip().split())
        # you can replace this `if` with `if fruits & words == set()`
        if not fruits & words:
            outf.write(line)
def compare_fruits():

    files = ["file1", "file2"]
    file_list = []

    for file in files:
        with open("filepath/%s.txt", % file "r") as f:
            file_list.append(f.readlines())

    list1 = [i.strip() for i in file_list[0]]
    list2 = [i.split()[2] for i in file_list[1]]

    diff = []

    for i in list1:
        for j in list2:
            if j not in i:
                diff.append(j)

    with open("filepath/file3.txt", "w") as f: #creates file3 if doesn't exist
        for i in diff:
            f.write(i + '\n')