Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:计算一个单词在文件中出现的次数_Python_File_Count - Fatal编程技术网

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

Python:计算一个单词在文件中出现的次数,python,file,count,Python,File,Count,我有一个文件,其中每行包含一个城市名和一个州名。假设我计算一个状态名出现的次数并返回该值 例如,如果我的文件包含: Los Angeles California San Diego California San Francisco California Albany New York Buffalo New York Orlando Florida 我想返回每个州名称出现的次数。我有这个给加利福尼亚的 for line in f: Ca

我有一个文件,其中每行包含一个城市名和一个州名。假设我计算一个状态名出现的次数并返回该值

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

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

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

使用字典存储计数器:

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}
您可以通过使用集合来简化它。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})

假设文章中的空格是制表符,下面的代码将为您提供一个dict,其中包含文件中所有状态的计数

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

或者,您可以只使用
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

我相信,这个常见问题的公认答案涵盖了“bw61293”由于其文本文件格式而提出的要求,但并不是所有文本文件的通用解决方案

他要求“计算一个单词在一个文件中出现的次数”,被接受的答案是每行只能计算一次单词“California”。因此,如果单词在一行上出现两次,那么它将只计算一次。虽然这对给定的格式有效,但如果“文件”是一本书,这并不是一个通用的解决方案

下面是对已接受答案的修复方法,即使用nltk将行打断为单词列表。唯一的问题是确保在命令提示符下使用“
pip install nltk
”pip安装nltk库,注意它是一个大库。如果要使用Anaconda,请使用“
conda安装-c Anaconda nltk
”。我使用Tweet标记器是因为“
don
”等词中的撇号会将字符串拆分为一个列表
['don',“'t”]
,但是Tweet标记器会返回
[“don”]
,以及其他原因。我还通过在
.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)

每次都会覆盖
total
的值。尝试使用
+=
(添加到并分配)。顺便说一句,如果你感兴趣的话,这就是你真正擅长的。欢迎来到SO。如果以下答案之一解决了您的问题,您应该接受它(单击相应答案旁边的复选标记)。这有两件事。它让每个人都知道你的问题已经解决了,并让帮助你的人相信你的帮助。有关完整的解释,请参阅。我认为这对于在两列上都包含纽约的行是不正确的。我认为您的代码给出了错误的最终计数-对于单个实例返回零。将
count[state]=0
更改为
count[state]=1
将*更正此问题。*我还没有测试过这个,但是我很确定这个修正是正确的。我认为你提到为什么被接受的答案应该改进是很好的,但是,在我看来,你的答案有点过头了。你自己也提到过NLTK是一个巨大的图书馆。。。请查看@m.wasowski提供的关于如何以更简单的方式解决此问题的信息。Fair point@AMerii您的权利这太过分了。我将发布一个更新,并添加一些代码,其中包含一个不是资源密集型的库。
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)