计算文本文件中字符串的出现次数

时间:2013-04-24 09:13:41

标签: python counter

我有以下程序,我想在我的文本文件中找到例如字符串'light pink'! 我使用word==' '.join(['light','pink'])但它不起作用。

from operator import itemgetter

def mmetric1(file):
    words_gen = (word.lower() for line in open("test.txt")
                                             for word in line.split())
    words = {}

    for word in words_gen:
        if (word=='aqua')or(word=='azure')or(word=='black')or(word=='light pink'):
            words[word] = words.get(word, 0) + 1

    top_words = sorted(words.items(), key=itemgetter(1))

    for word, frequency in top_words:
       print ("%s : %d" % (word, frequency))

3 个答案:

答案 0 :(得分:1)

您已将整行拆分为单独的字词:

for word in line.split()

因此words_gen中没有包含文字light pink的单个词。它包含lightpink作为两个单独的单词,以及该行上的所有其他单词。

你需要一种不同的方法;看看正则表达式。

答案 1 :(得分:1)

你的整个方法都是错误的。

在我看来,您想要检查文件中是否存在一组字符串。你应该使用正则表达式。

下面:

from collections import Counter
import re

def mmetric1(file_path, desired):
    finder = re.compile(re.escape('(%s)' % '|'.join(desired)), re.MULTILINE)
    with open(file_path) as f:
        return Counter(finder.findall(f))

# have a list of the strings you want to find
desired = ['aqua', 'azure', 'black', 'light pink']
# run the method
mmetric1(file_path, desired)

如果您担心大文件和性能,可以迭代文件中的行:

def mmetric1(file_path, desired):
    results = Counter()
    finder = re.compile(re.escape('(%s)' % '|'.join(desired)))
    with open(file_path) as f:
        for line in f:
            Counter.update(finder.findall(line))
    return results

要打印这些结果,请使用自己的结果:

for word, frequency in mmetric1(file_path, desired).items():
    print ("%s : %d" % (word, frequency))

答案 2 :(得分:0)

分割字符串时,它的分割基于空白,包括空格字符

所以稍后,除了IF之外,你不可能以你提议的方式匹配连续的单词

  • 你不想修改你的循环

示例代码

try:
   while True:
        word = next(words_gen)
       if any(word == token for token in ['aqua', 'azure', 'black']) \
          or (word == 'light' and  next(word) == 'pink'):
            words[word] = words.get(word, 0) + 1 
except StopIteration:
    pass
  • 使用正则表达式

如果您正在搜索大文件,那么这不是一个好的选择

  • 使用其他一些数据结构,例如前缀Tree