如何在python中调用特定的csv字段值

时间:2013-11-19 14:09:24

标签: python python-2.7 csv row

我是python的新手(一周),所以我希望我能正确地提出这个问题。

我已将csv格式的成绩单导入python 2.7。第一列是学生的姓名,列标题是作业的名称。所以数据看起来像这样:

Name    Test1   Test2   Test3   
Robin   89  78  100
...
Rick    72      100     98  

我希望能够通过输入此人的姓名和作业来做(或让别人做)3件事。 1.为该作业获得该人的分数 2.获得该作业的平均分数 3.获得那些人的平均分数

但由于某种原因,我迷失了如何让python识别我想要调用的字段。到目前为止,这就是我所拥有的(到目前为止唯一有效的部分是调用文件):

 data = csv.DictReader(open("C:\file.csv"))
 for row in data:
    print row

 def grade() 
 student= input ("Enter a student name: ")
 assignment= input("Enter a assignment: ")

 for row in data:
    task_grade= data.get(int(row["student"], int(row["assignment"])) # specific grade
    task_total= sum(int(row['assignment']))  #assignment total
    student_total=  #student assignments total-- no clue how to do this

 task_average= task_total/11
 average_score= student_total/9

3 个答案:

答案 0 :(得分:2)

您可以通过以下方式访问csv的各个“列”:

import csv

def parse_csv():
    csv_file = open('data.csv', 'r')
    r = csv.reader(csv_file)
    grade_averages = {}
    for row in r:
        if row[0].startswith('Name'):
            continue
        #print "Student: ", row[0]
        grades = []
        for column in row[1:]:
            #print "Grade: ", column
            grades.append(int(column.strip()))
        grade_total = 0
        for i in grades:
            grade_total += i
        grade_averages[row[0]] = grade_total / len(grades)

    #print "grade_averages: ", grade_averages
    return grade_averages

def get_grade(student_name):
    grade_averages = parse_csv()
    return grade_averages[student_name]

print "Rick: ", get_grade('Rick')
print "Robin: ", get_grade('Robin')

答案 1 :(得分:1)

您要做的不是Python,因为您有键和值。然而...

如果您知道列始终相同,则无需使用关键字,您可以使用以下位置:

以下是执行1和3的简单,低效的方法:

students_name = ...
number = ...
for line in open("C:\file.csv")).readlines()
    items = line.split()
    num_assignments = len(items)-1
    name = items[0]
    if name = students_name:
        print("assignment score: {0}".format(items[number]))
        asum = 0
        for k in range(0,num_assignments):
             asum+= items[k+1]
        print("their average: {0}".format(asum / num_assignments)

要做2,你应该预先计算平均值并返回它们beucase每个分配的平均值对于每个用户查询是相同的。

我说easy * innefficnet因为每次输入名称时都会搜索每个用户查询的文本文件。要正确地做,你应该建立一个包含所有名称及其信息的字典。但是这个解决方案更复杂,你只有一个星期了!而且,它的时间越长,你就应该试一试。查看dict

答案 2 :(得分:0)

相信你第二次看不到该字段的原因是因为csv.DictReader()返回的迭代器是一次性迭代器。也就是说,一旦你到达csv文件的最后一行,它就不会重置到第一个位置。

所以,通过这样做:

  data = csv.DictReader(open("C:\file.csv"))
  for row in data:
  print row

你正在运行它。尝试评论这些行,看看是否有帮助。