首页 > 解决方案 > 无法连续计算实例数

问题描述

您好,我正在创建一个评分系统,该系统会打开一个 .csv 文件并列出学生名单,计算他们每个人的通过次数、成绩和荣誉。

样本数据

First Name, Last Name, Test 1, Test 2, Test 3
John,        Doe,        P,       P,       M
Mary,        Jane,       P,       D,       M
Bruce,       Wayne,      P,       M,       D

所以约翰将有 2 次传球,1 次功绩。Mary 1 of each etc. 这是我正在处理的代码。不幸的是,它是垂直计算成绩,所以 row[1] 是 3 次通过, row[2] 是 1 等,而不是水平读取。有谁知道如何解决这一问题?

import csv
import collections

#Create Counter
grades = collections.Counter()

#Open file and read
with open('Results.csv', 'r') as csv_file:
    csv_reader = csv.reader(csv_file)


    for row in csv_reader:
        grades[row[2]] += 1

        print('Number of Pass grades: %s' % grades['P'])
        print('Number of Merit grades: %s' % grades['M'])
        print('Number of Distinction grades: %s' % grades['D'])

标签: pythoncsv

解决方案


您可以计算每一行的通行证、优点和区别。list.count()然后使用方法(list.count 上的详细信息)将每条记录的通过次数、优点和区别分别添加到列表中。

input_data.csv

First Name,Last Name,Test1,Test2,Test3
John,Doe,P,P,M
Mary,Jane,P,D,M
Bruce,Wayne,P,M,D

code.py

import csv

with open("input_data.csv") as csv_file:
    csv_reader = csv.reader(csv_file)
    result = []
    header_column = True
    for data in csv_reader:
        if header_column:
            header_column = False
            continue        
        row = data[:]
        row.append(data[2:].count("P"))
        row.append(data[2:].count("M"))
        row.append(data[2:].count("D"))
        result.append(row)
    print(result)

输出:

[['John', 'Doe', 'P', 'P', 'M', 2, 1, 0], ['Mary', 'Jane', 'P', 'D', 'M', 1, 1, 1], ['Bruce', 'Wayne', 'P', 'M', 'D', 1, 1, 1]]

解释:

  • 我们跳过列表中的第一行,result因为它包含标题信息。
  • result是一个 2D 列表,其中每个内部列表按顺序包含以下信息:[ First name, Last Name, Test1, Test2, Test3, Number of passes, Number of merits, Number of distinctions]
  • 这里data[2:]确保我们不计算P,M或列中的D值。First NameLast Name

替代解决方案:

  • 我们可以使用csv.DictReader将每条记录作为字典。

参考:


推荐阅读