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

2 投票
2 回答
2425 浏览
提问于 2025-04-16 11:44

我在Linux上使用Python 2.6。

我有两个文本文件。第一个文件叫做first.txt,每一行都有一段文字,内容大概是这样的:

lorem
ipus
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 个回答

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()
4

我的方法是这样的:先读取第二个文件,把里面的内容都变成小写字母,然后把这些单词放到一个列表里。接着,把这个列表转换成一个集合,这样在处理大文件时会更快。

然后逐行查看第一个文件的内容,如果这行内容(同样转换成小写,并去掉多余的空格)不在我们刚才创建的集合里,就把它写入第三个文件。

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运算符的意思就是检查某个值是否在一个集合里。当用在列表上时,它会逐个检查,就像你的代码那样,但用在集合上时,它会利用哈希表来更快地查找。not in则是相反的意思。(可能会让人困惑的是:in也用于定义for循环(for x in [1, 2, 3]),但这两者没有关系。)

撰写回答