2013-02-22 3 views
0

Я пытаюсь прочитать в .csv-файле и создать 2-мерный массив значений поплавков. Это то, что я сделал до сих пор:Прочитайте файл .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) выглядит так, как будто она работает. Каждая строка помещается в список значений float. Но когда я печатаю (all_values), это не работает. Я создал список списков (правильное количество строк), но это только последняя строка значений, повторяющихся снова и снова. Возможно, у меня есть .append() в неправильном месте?

Я должен сказать, что это мое первое программирование на python, но я программировал на C++ годами. Любая помощь/советы были бы очень оценены. Спасибо!

+0

У вас есть серьезная проблема с отступом. Либо вы уронили его при публикации здесь, либо не поняли, что на python используется отступ для управления потоком. – arkascha

+0

Извините, я должен был сказать. Это версия Python 3.3 – user2098583

+0

Я не мог понять, как форматировать код при публикации здесь, но в моем коде есть отступы. – user2098583

ответ

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, что является тем же самым, что означает, что два элемента в b являются одним и тем же элементом.

Таким образом, фиксированная (и более вещая) версия вашего цикла будет:

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

Если вам не нравятся подсказки списков, вы можете использовать синтаксис «для i, item в перечислении (строка):», чтобы автоматически получить индекс :) ​​ –

+0

@MichaelClerx: Правда, это был бы более пифонический подход. Тем не менее, это не решает проблему повторного использования массива. – rainer

+0

Абсолютно! Просто добавив к вашему ответу :) –

1

Вы создаете только один объект массива и добавляете к нему один и тот же объект массива. Таким образом, только последняя строка повторяется в конечном выпуске.

Вы должны создать объект массива внутри цикла первого уровня и добавить его в список.

Смежные вопросы