2013-02-22 112 views
0

我正尝试读取.csv文件并创建一个浮点数值的二维数组。这是我迄今为止所做的:使用嵌套for循环读取.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++进行编程。任何帮助/提示将不胜感激。谢谢!

+0

你有一个严重的缩进问题。要么在这里发布时放弃它,要么你不明白python使用缩进来控制流量。 – arkascha 2013-02-22 08:47:15

+0

对不起,我应该说。它是Python版本3.3 – user2098583 2013-02-22 08:47:23

+0

我无法弄清楚在这里发布时如何格式化代码,但是我的代码中存在缩进。 – user2098583 2013-02-22 08:49:40

回答

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中的两个元素是相同的元素。

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

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到漂浮并将其存储在一个数组,然后将其附加到all_values

+0

如果你不喜欢列表解析,你可以使用“for i,item in enumerate(row):”这样的语法来自动得到指令:) – 2013-02-22 09:12:52

+0

@MichaelClerx:确实,这将是一个更为pythonic的方法。但是,这并不能解决重新使用数组的问题。 – rainer 2013-02-22 09:16:57

+0

绝对!只需添加到您的答案:) – 2013-02-22 09:22:09

1

您只创建一个数组对象并将相同的数组对象追加到列表中。所以只有最后一行重复输出。

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