在Python中搜索两个文件

时间:2015-05-05 08:51:38

标签: python file search

我想找到两个文件之间匹配的字符。在file1.txt我有red green bluefile2.txt我有green gray, 我想要输出:

green

我已经尝试过了:

searchfile = open("file1.txt", "r")
      for line in searchfile:
         if "red" in line:
             print line
      searchfile.close()

但它打印整个文件内容。我怎样才能得到这个输出?

2 个答案:

答案 0 :(得分:2)

您询问如何找到两个文件中的字符,但是从您预期的输入和输出看来,您实际上希望两个文件中都存在,并由一个空间。

set1 = set(open("a.txt").read().split())
set2 = set(open("b.txt").read().split())
print filter(lambda x: x in set1, set2)

打印

['green']

a.txt包含

red green blue

b.txt包含

green gray

如果您不是特别感兴趣的话,请不要读过这里。这是更快 - 而且更漂亮 - 的方法。

由于OP要求采用其他方法,如果您非常非常特别关注时间复杂度,您可以创建一个生成器函数:

whitespace = {' ','\n'}
def word_generator(file_object):
  str_list = []
  for char in file_object:
    if char not in whitespace:
      str_list.append(char)
    else:
      yield "".join(str_list)
      del str_list[:]

with open("a.txt") as f1, open("b.txt") as f2:
  set1 = set(word_generator(f1.read()))
  set2 = set(word_generator(f2.read()))
  print filter(lambda x: x in set1, set2)

这样您就不会将文件内容读入字符串,将字符串拆分为列表,然后从列表中构建集合。相反,你是"分裂"即时的字符串,直接将字词提供给集合理解。

成本也较低(尽管非常微不足道),因为您只是将每个角色与空格和换行进行比较。没有任何参数的splitspace, tab, newline, return and formfeed进行比较。就像我说的那样,差别非常微不足道。

<强> [编辑]

虽然我对不同方法的复杂性的推理似乎(至少对我而言)听起来很有效,split的高效C实现似乎胜过使用生成器的好处:

def split():
  set1 = set(open("a.txt").read().split())
  set2 = set(open("b.txt").read().split())
  lst = filter(lambda x: x in set1, set2)

def generator():

  whitespace = {' ','\n'}
  def word_generator(file_object):
    str_list = []
    for char in file_object:
      if char not in whitespace:
        str_list.append(char)
      else:
        yield "".join(str_list)
        del str_list[:]
  with open("a.txt") as f1, open("b.txt") as f2:
    set1 = set(word_generator(f1.read()))
    set2 = set(word_generator(f2.read()))
    lst = filter(lambda x: x in set1, set2)

if __name__ == "__main__":
  from timeit import timeit
  print timeit("split()", setup="from __main__ import split", number=10000)
  print timeit("generator()", setup="from __main__ import generator", number=10000)

以上产量

0.103315830231
0.151041984558

因此(在许多后续运行中的比例几乎相同),所以看起来你应该采用第一种更简单的方法。如何释放,发电机解决方案真的很难看。

如果有人对第一种方法为何更快有不同的看法,我很乐意听到它。

答案 1 :(得分:1)

你应该:

  1. 对于每个文件,使用当前代码和拆分功能
  2. 制作颜色列表
  3. 构建集和计算交集:s1&amp; S2