在一个文件中使用文本搜索第二个文件中的匹配项
我在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 个回答
假设你想在第二个文件中找到整行内容:
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()
我的方法是这样的:先读取第二个文件,把里面的内容都变成小写字母,然后把这些单词放到一个列表里。接着,把这个列表转换成一个集合,这样在处理大文件时会更快。
然后逐行查看第一个文件的内容,如果这行内容(同样转换成小写,并去掉多余的空格)不在我们刚才创建的集合里,就把它写入第三个文件。
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]
),但这两者没有关系。)