Python:统计一个单词在文件中出现的次数
我有一个文件,里面每一行都有一个城市名和一个州名。我需要统计每个州名出现的次数,并返回这个数字。
比如,如果我的文件内容是:
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 个回答
假设你帖子里的空格是用来表示制表符(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)
我觉得这个常见问题的接受答案是针对'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)
另外,你可以直接使用 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
可以用字典来存储计数器:
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})
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