0

我正在尝试读取 .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)

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

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

4

2 回答 2

1

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

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

于 2013-02-22T09:06:51.600 回答
1

问题是每次附加数组时都会all_values存储对数组的引用,而不是副本。因此, 的所有元素都是指向同一个数组的引用,您在每次迭代中覆盖其中的值。row_valuesall_valuesrow_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语句显示了 中两个值的 id b,它是相同的,这意味着 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为浮点数并将它们存储在一个数组中,然后将其附加到all_values.

于 2013-02-22T09:07:03.197 回答