我在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()
绝对不优雅。任何人都有建议如何解决这个或更好的解决方案?
答案 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()