Python:计算文件中单词出现的次数

时间:2014-04-03 21:49:29

标签: python file count

我有一个文件,其中包含城市名称,然后是文件中每行的州名称。我想要计算状态名称出现的次数并返回值。

例如,如果我的文件包含:

Los Angeles   California
San Diego     California
San Francisco California
Albany        New York
Buffalo       New York
Orlando       Florida

我想要返回每个州名发生的次数。我有这个在加州。

for line in f:
    California_count=line.find("California")
    if California_count!=-1:
        total=line.count("California")
print(total)

这只给我值1,我假设是因为它每行发生1次。如何让它返回数字3而不是数字1?

5 个答案:

答案 0 :(得分:4)

使用字典存储计数器:

data = """Los Angeles   California
San Diego     California
San Francisco California
Albany        New York
Buffalo       New York
Orlando       Florida""".splitlines()

counters = {}
for line in data:
    city, state = line[:14], line[14:]
    # city, state = line.split('\t') # if separated by tabulator
    if state not in counters:
        counters[state] = 1
    else:
        counters[state] += 1
print counters
# {'Florida': 1, 'New York': 2, 'California': 3}

您可以使用collections.defaultdict

来简化它
from collections import defaultdict
counter = defaultdict(int)
for line in data:
    city, state = line[:14], line[14:]
    counter[state] += 1

print counter
# defaultdict(<type 'int'>, {'Florida': 1, 'New York': 2, 'California': 3})

或使用collections.Counter和生成器表达式:

from collections import Counter
states = Counter(line[14:] for line in data)
# Counter({'California': 3, 'New York': 2, 'Florida': 1})

答案 1 :(得分:3)

total = 0

with open('input.txt') as f:
    for line in f:
        found = line.find('California')
        if found != -1 and found != 0:
            total += 1

print total

输出:

3

答案 2 :(得分:2)

或者,您可以使用re模块,并使用正则表达式:

import re

states = """
Los Angeles   California
San Diego     California
San Francisco California
Albany        New York
Buffalo       New York
Orlando       Florida
"""

found = re.findall('[cC]alifornia', states)

total = 0

for i in found:
    total += 1

print total

答案 3 :(得分:1)

假设帖子中的空格是标签,下面的代码会给你一个包含文件中所有状态计数的字典。

#!/usr/bin/env python3

counts = {}
with open('states.txt', 'r') as statefile:
    for i in statefile:
        state = i.split('\t')[1].rstrip()
        if state not in counts:
            counts[state] = 0
        else:
            counts[state] += 1
    print(counts)

答案 4 :(得分:1)

由于他的文本文件的格式,我相信这个常见问题的答案涵盖了'bw61293'的要求,但并不是所有文本文件的通用解决方案!

他要求“计算一个文件中一个单词出现的次数”,被接受的答案每行只能对“加利福尼亚”一词进行一次计数。因此,如果单词在一行中出现两次,那么它只会计数一次。尽管这对于给定的格式确实有效,但是说“文件”是否为书本并不是一个通用的解决方案。

下面是对“已接受”答案的修正,即使用nltk将行分成单词列表。唯一的问题是,请确保在命令提示符中用'pip install nltk'pip安装nltk库,请注意它是一个很大的库。如果要使用Anaconda,请使用'conda install -c anaconda nltk'。我之所以使用Tweet令牌生成器,是因为诸如“ don't”之类的单词中的撇号会将字符串分成列表['don', "'t"],但是TweetTokenizer将返回["don't"]。我还通过仅在.lower()中使用.count()使其不区分大小写。我希望这将对希望对“计算一个文件中一个单词出现多少次”的问题有更一般解决方案的人们有所帮助。

我是StackOverflow的新手,所以请提供反馈,以改进我的代码或我为第一个评论写的内容!

更新我犯了一个错误,下面的问题现已修复!! (请记住,这是一个不区分大小写的搜索,如果要区分大小写,请从列表解析中删除.lower()。谢谢。)我还承诺在有足够的时间时不使用nltk进行回答。 strong>

from nltk.tokenize import TweetTokenizer
tknzr = TweetTokenizer()

total = 0

with open('input.txt') as f:
    for line in f:
        LineList = tknzr.tokenize(line)
        LineLower = [x.lower() for x in LineList]
        found = LineLower.count('california')
        if found != -1 and found != 0:
            total += found

print(total)