计算csv中特定单词出现的Python算法

时间:2012-02-12 07:41:27

标签: python algorithm csv counting

我刚开始学习python。 我很想知道在CSV文件中计算特定单词出现的有效方法是什么,而不是简单地使用for循环逐行进行读取。

更具体地说,假设我有一个CSV文件包含两列,“名称”和“等级”,有数百万条记录。

如何计算“等级”下“A”的出现次数?

非常感谢Python代码示例!

3 个答案:

答案 0 :(得分:9)

基本示例,使用标准Python库中的csvcollections.Counter(Python 2.7+):

import csv
import collections

grades = collections.Counter()
with open('file.csv') as input_file:
    for row in csv.reader(input_file, delimiter=';'):
        grades[row[1]] += 1

print 'Number of A grades: %s' % grades['A']
print grades.most_common()

输出(对于小数据集):

Number of A grades: 2055
[('A', 2055), ('B', 2034), ('D', 1995), ('E', 1977), ('C', 1939)]

答案 1 :(得分:2)

您当然应该阅读所有成绩,在这种情况下也意味着阅读整个文件。您可以使用csv模块轻松读取逗号分隔值文件:

import csv
my_reader = csv.reader(open('my_file.csv'))
ctr = 0
for record in my_reader:
    if record[1] == 'A':
        ctr += 1
print(ctr)

这非常快,我使用Counter方法无法做得更好:

from collections import Counter
grades = [rec[1] for rec in my_reader] # generator expression was actually slower
result = Counter(grades)
print(result)

最后但并非最不重要的是,列表包含count方法:

from collections import Counter
grades = [rec[1] for rec in my_reader]
result = grades.count('A')
print(result)

答案 2 :(得分:2)

正如您所看到的,有很多方法可以解决这个问题。

评估速度的最佳方法是使用timeit计时。例如:

% python -m timeit -c 'import csv
with open("./grades.csv") as grades:
    table = csv.DictReader(grades)
    sum(1 for row in table if row["Grade"] == "A")      
'
10000 loops, best of 3: 129 usec per loop