Python 比较2个txt文件,并根据1或2个文件中缺少的内容创建一个新的txt文件
我有两个txt文件,一个是水果列表,另一个是许多数据的列表,每行中嵌入一个水果,如下所示: 文件1: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中提取行,其中对应的结果没有出
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')