2011-02-13 120 views
2

我使用python 2.6在Linux上。在一个文件中使用文本搜索赛在第二个文件

我有两个文本文件 first.txt对每行文本的一个字符串。所以它看起来像

LOREM
议会联盟
ASFD

第二个文件不相当有相同的格式。 它看起来更像是这个

1231 LOREM
1311 assss 311

我想借此从first.txt文本的每一行,并确定是否有在第二个文本匹配。如果没有匹配,我想将缺失的文本保存到第三个文件。我想忽略情况,但并非完全必要。这就是为什么我在看正则表达式,但没有多少运气。

所以我打开文件,使用readlines方法()来创建一个列表。
遍历列表并打印出匹配项。

这里是我的代码

first_file=open('first.txt', "r") 
first=first_file.readlines() 
first_file.close() 

second_file=open('second.txt',"r") 
second=second_file.readlines() 
second_file.close() 

while i < len(first): 
    j=search[i] 
    while k < len(second): 
    m=compare[k] 
    if not j.find(m): 
    print m 
    i=i+1 
    k=k+1 
exit() 

这绝对不是优雅。任何人都有建议如何解决这个问题或更好的解决方案?

+1

lorem`是否也匹配`somelorem`?整条线是否应该完全相同?应该只有单词是相同的? – Wolph 2011-02-13 06:05:29

回答

3

我的做法是这样的:阅读的第二个文件,将其转换成小写,然后创建它包含的单词列表。然后将此列表转换为set,以获得更好的大文件性能。

然后通过在第一文件中的每一行,如果它(也被转换为小写,并去除多余的空格)是不是在我们创建的集,其写入第三个文件。

with open("second.txt") as second_file: 
    second_values = set(second_file.read().lower().split()) 

with open("first.txt") as first_file: 
    with open("third.txt", "wt") as third_file: 
     for line in first_file: 
      if line.lower().strip() not in second_values: 
       third_file.write(line + "\n") 

设置对象是一个简单的容器类型,它是无序的,不能包含重复的值。它旨在让您快速添加或移除项目,或者确定项目是否已经在设置中。

with声明以确保文件被关闭,即使发生异常的便捷方式。它们在Python 2.6以上版本中默认启用,在Python 2.5中,它们要求您将行from __future__ import with_statements置于文件的顶部。

in运营商做什么,它听起来就像:告诉你,如果一个值可以在集合中找到。与列表一起使用时,它只是迭代遍历,就像你的代码一样,但是当与一个set对象一起使用时,它使用散列执行得更快。 not in则相反。 (可能的困惑点:in也用于定义for循环(for x in [1, 2, 3]),但这是无关的。)

+0

我很感谢帮助! – RSolis 2011-02-13 06:45:59

1

假设你正在寻找第二个文件中的整条生产线:

second_file=open('second.txt',"r") 
second=second_file.readlines() 
second_file.close() 


first_file=open('first.txt', "r") 
for line in first_file: 
    if line not in second: 
     print line 

first_file.close() 
相关问题