Python:统计一个单词在文件中出现的次数

4 投票
5 回答
30045 浏览
提问于 2025-04-18 01:15

我有一个文件,里面每一行都有一个城市名和一个州名。我需要统计每个州名出现的次数,并返回这个数字。

比如,如果我的文件内容是:

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,我猜这是因为每一行只出现一次。那我该怎么做才能得到3而不是1呢?

5 个回答

1

假设你帖子里的空格是用来表示制表符(Tab)的,下面的代码会给你一个字典,里面包含了文件中所有状态的计数。

#!/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)
2

我觉得这个常见问题的接受答案是针对'bw61293'提问的文本文件格式的,但并不是所有文本文件的通用解决方案!

他问的是“如何计算一个单词在文件中出现的次数”,而接受的答案只能在每一行中计算一次“California”。也就是说,如果这个单词在同一行出现了两次,它只会算一次。虽然这个方法适用于给定的格式,但如果文件是一本书,那就不适用了。

对接受答案的一个修正方法是使用nltk库将行分割成单词列表。唯一的问题是要确保在命令提示符中用'pip install nltk'安装nltk库,注意这个库比较大。如果你想用Anaconda,可以用'conda install -c anaconda nltk'。我使用了Tweet Tokenizer,因为像"don't"这样的单词中的撇号会把字符串分割成列表['don', "'t"],而TweetTokenizer会返回["don't"],还有其他一些原因。我还通过在.count()中使用.lower()来实现不区分大小写的搜索。我希望这能帮助那些想要更通用解决方案的人,来解决“如何计算一个单词在文件中出现的次数”的问题。

我刚刚加入StackOverflow,所以请给我一些关于我的代码或我第一次评论的反馈,帮助我改进!

更新:我犯了个错误,下面的内容现在已经修正了!!(请记住这是不区分大小写的搜索,如果你想要区分大小写,请从列表推导中去掉.lower()。谢谢。)我也承诺在有足够时间时会提供一个不使用nltk的答案。

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

另外,你可以直接使用 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
7

可以用字典来存储计数器:

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

撰写回答