在python中搜索大文件中的单词列表

时间:2012-07-13 17:56:56

标签: python

我是新的python。我有一个单词列表和一个非常大的文件。我想删除文件中包含单词列表中单词的行。

单词列表按排序给出,可以在初始化期间输入。我正在努力寻找解决这个问题的最佳方法。我现在正在进行线性搜索,这花费了太多时间。

有什么建议吗?

5 个答案:

答案 0 :(得分:3)

你可以使用集合论中的intersection来检查一行中的单词和单词列表是否有任何共同点。

list_of_words=[]
sett=set(list_of_words)
with open(inputfile) as f1,open(outputfile,'w') as f2:
    for line in f1:
        if len(set(line.split()).intersection(sett))>=1:
            pass
        else:
            f2.write(line)

答案 1 :(得分:1)

如果源文件仅包含以空格分隔的单词,则可以使用集合:

words = set(your_words_list)
for line in infile:
    if words.isdisjoint(line.split()):
        outfile.write(line)

请注意,这不会处理标点符号,例如给定words = ['foo', 'bar']foo, bar,stuff之类的行不会被删除。要处理这个问题,您需要使用正则表达式:

rr = r'\b(%s)\b' % '|'.join(your_words_list)
for line in infile:
    if not re.search(rr, line):
        outfile.write(line)

答案 2 :(得分:0)

大文件中的行和单词需要以某种方式进行排序,在这种情况下,您可以实现二进制搜索。通过检查列表中的每个单词是否在给定的行中,它看起来不是最好的线性搜索。

答案 3 :(得分:0)

contents = file.read()
words = the_list.sort(key=len, reverse=True)
stripped_contents = re.replace(r'^.*(%s).*\n'%'|'.join(words),'',contents)

类似的东西应该有用......不确定它是否比逐行扫描更快

[edit]这是未经测试的代码,可能需要稍微调整一下

答案 4 :(得分:0)

您无法就地删除这些行,您需要重写第二个文件。之后您可以覆盖旧的(请参阅shutil.copy)。

其余的读取像伪代码:

forbidden_words = set("these words shall not occur".split())

with open(inputfile) as infile, open(outputfile, 'w+') as outfile:
  outfile.writelines(line for line in infile
      if not any(word in forbidden_words for word in line.split()))

有关如何摆脱标点符号引起的假阴性的方法,请参阅this question