使用嵌套for循环读取.csv文件,仅获取最后一行

时间:2013-02-22 08:43:05

标签: python csv for-loop

我正在尝试读取.csv文件并创建一个浮点值的二维数组。这是我到目前为止所做的:

import csv
filename  = 'data_out.csv'   
# create an array for the for the data    
row_values = [None]*len(header)   
all_values = []

reader = csv.reader(open(filename,'rt'),delimiter=',')
next(reader) #skip header line
for row in reader:
    i=0
    for item in row:
        value = float(item)
        row_values[i]=value
        i=i+1
        print(row_values)
    all_values.append(row_values)

print(all_values)

print(row_values)看起来很有效。每行都放入浮点值列表中。但是当我打印(all_values)时,它不起作用。我已经创建了一个列表列表(正确的行数),但它只是一遍又一遍重复的最后一行值。也许我把.append()放在错误的位置?

我应该说这是我第一次在python中编程,但我已经用C ++编程多年了。任何帮助/提示将非常感激。谢谢!

2 个答案:

答案 0 :(得分:1)

您只创建一个数组对象并将相同的数组对象附加到列表中。因此,只有最后一行在最终输出中重复。

您应该在第一级循环中创建数组对象并将其附加到列表中。

答案 1 :(得分:1)

问题是all_values每次附加而不是副本时都会将引用存储到数组row_values。因此,all_values的所有元素都是指向同一数组的引用,在每次迭代中,您将覆盖row_values中的值。

见这个,例如:

b = []

a = [1, 2]
b.append(a)
print b

a[0] = 3
b.append(a)
print b

print id(b[0]), id(b[1])

这与您的程序具有相同的效果,它将为第二个[[3, 2], [3, 2]]语句打印print。最后一个print语句显示b中两个值的id,它们是相同的,这意味着b中的两个元素是相同的元素。

因此,循环的固定(和更多pythonic)版本将是:

reader = csv.reader(open(filename,'rt'),delimiter=',')
for row in reader:
    row_values = [float(item) for item in row]
    all_values.append(row_values)

print all_values

第三行使用列表推导将row中的所有值转换为浮点数,并将它们存储在 new 数组中,然后将其附加到all_values