繁体   English   中英

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

[英]Count occurences of strings in a text file

我有以下程序,我想在我的文本文件中找到例如字符串'浅粉红色'! 我使用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))

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

for word in line.split()

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

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

你的整个方法都是错的。

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

这里:

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))

拆分字符串时,它会根据包含空格字符的空格进行拆分

所以稍后,除了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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM