比较2个文本文件并根据1或文件中缺少的文件创建新的txt文件

时间:2013-12-03 16:55:23

标签: python list loops

我有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'一词是葡萄柚这个词的一部分,它将排除一些更简单的提取方法。

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

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  

我尝试过使用for循环的各种方法while循环和if语句但似乎总是陷入语法困境。我试图想象代码工作为两个轮子相互旋转,而1是静止的,另一个旋转一直到找到匹配。如果发现匹配,则静止轮将在1个位置移动,并且移动轮将重置。如果固定轮在移动轮上没有找到匹配,则该数据将进入新的篮子。这将一直持续到固定轮上的所有位置都被移动轮移动。

2 个答案:

答案 0 :(得分:0)

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

with open('listOfFruits.txt', 'r') as f:
    fruits = set([line.rstrip() for line in f])
with open('allFruitData.txt', 'r') as f:
    data = {}
    for line in f:
        fruit = line.rstrip().split()[2]
        data[fruit] = line

fruits_not_in_file = set(data.keys()) - fruits
with open(outfile, 'w') as f:
    for fruit in fruits_not_in_lile:
        f.write(data[fruit])

修改

如果水果可以出现在任何栏目中,如果你不知道哪些词是水果,这个问题要困难得多。但是,如果您只想打印出不包含任何命名水果的行,那也不错:

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)

这样做首先在所有水果中作为一套阅读。然后,对于数据文件中的每一行,我们测试该行中的任何单词是否在水果集中。如果交集为空,则将该行打印到outfile。如果该行包含某处的水果,则继续下一行。

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

答案 1 :(得分:0)

这应该可以胜任(假设file2中的水果总是第三项):

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')