你好,我正在创建一个评分系统,它打开一个.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次功绩。玛丽各1个等。这是我正在编写的代码。不幸的是,它是垂直计算成绩的,所以第[1]行是3次通过,第[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'])
您可以计算每一行的通过次数、优点和区别。然后使用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:]
确保我们不计算First Name
和Last Name
列中的P
、M
或D
值
替代解决方案:
- 我们可以使用
csv.DictReader
,它将把每个记录作为字典
参考文献:
- 1:list.count上的Python文档