使用一个文件中的文本在第二个文件中搜索匹配项

时间:2011-02-13 05:27:00

标签: python regex string search

我在linux上使用python 2.6。

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

LOREM
议会联盟
asfd

第二个文件的格式不完全相同。 看起来更像是

1231 lorem
1311 assss 31 1
等等

我想从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() 

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

2 个答案:

答案 0 :(得分:4)

我的方法是这样:读取第二个文件,将其转换为小写,然后创建它包含的单词列表。然后将此列表转换为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")

set对象是一种简单的容器类型,它是无序的,不能包含重复值。它旨在允许您快速添加或删除项目,或者告知项目是否已在集合中。

with语句是确保文件关闭的便捷方式,即使发生异常也是如此。从Python 2.6开始默认启用它们,在Python 2.5中,它们要求您将行from __future__ import with_statements放在文件的顶部。

in运算符听起来像:告诉您是否可以在集合中找到值。当与列表一起使用时,它就像你的代码一样迭代,但是当与set对象一起使用时,它使用哈希来更快地执行。 not in反其道而行之。 (可能存在混淆点:定义in循环(for)时也会使用for x in [1, 2, 3],但这是无关的。)

答案 1 :(得分: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()