我正在尝试读取.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 :(得分: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
。