Python:将CSV数据存储在列表或数组中

时间:2016-03-05 09:14:28

标签: python arrays csv numpy

我有一个csv文件,存储了学生尝试每个问题的次数,其格式如下

UserID Q1 Q2 Q3 Q4
20     1  2  3  1
21     0  1  2  1

我正在尝试编写一个python程序来将数据存储到数组 attempts_count 中。

attempts_count = numpy.zeros(shape=(2000,200,200))
with open('Question_Attempts_Worksheet_1.csv' , 'r') as csvfile:
        csvfile.readline()  # skip the first line(column title)
        for line in csvfile:
            csv_row = line.split()
            user_id = csv_row[0]
            for question_counter in range(0,4):
                attempts_count[user_id][1][question_counter] += csv_row[question_counter + 1]

我希望获得attempts_count[20][1][0]=1attempts_count[20][1][2]=3

但是,我收到一条错误消息

  

“IndexError:只有整数,切片(:),省略号(...),   numpy.newaxis(None)和整数或布尔数组有效   指数”。

我可以知道如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

解决此问题的最佳方法是csv个包,因为该文件采用csv格式。这是使用csv包完成的方法:

attempts_count = numpy.zeros(shape=(2000,200,200))
with open ('Question_Attempts_Worksheet_1.csv' , 'r') as csvfile:
    reader = csv.reader(csvfile, delimiter=',')
    next(reader, None)  # skip the headers
    for row in reader:
        for question_counter in range(0,4):
            attempts_count[int(row[0])][1][question_counter] += int(row[question_counter + 1])

但是,要从代码开始,代码中至少可以识别出三个问题。

第一个问题出在你的userId上,因为你是从CSV文件获得的,它是string而不是整数。在使用之前尝试将其转换为int

user_id = int(csv_row[0]) #here, get this as integer

第二个问题是您似乎没有基于,分隔符拆分CSV行(而CSV文件的行值用逗号分隔)。因此,使用分隔符string.split(',')更新,

csv_row = line.split(',') # put , as separator here

最后,第三个问题类似于第一个问题。由于您希望将csv_row[question_counter + 1]添加到attemps_count,因此必须将其转换为数字:

attempts_count[user_id][1][question_counter] += int(csv_row[question_counter + 1])

完整代码应如下所示:

attempts_count = numpy.zeros(shape=(2000,200,200))
with open('Question_Attempts_Worksheet_1.csv' , 'r') as csvfile:
    csvfile.readline()  # skip the first line(column title)
    for line in csvfile:
        csv_row = line.split(',') # put , as separator here
        user_id = int(csv_row[0]) #here, get this as integer
        for question_counter in range(0,4):
            attempts_count[user_id][1][question_counter] += int(csv_row[question_counter + 1])