2016-04-12 4 views
1

Я пытаюсь построить два простых списка из объекта CSV в Python 2.6. Во всех моих тестах, второй сгенерированный список всегда возвращается как пустой (первый сгенерированный список возвращает только штраф.) Почти так, как будто второе понимание списка начинается до того, как первый закончен. Единственный способ, которым я могу заставить этот код работать, как и ожидалось, - скопировать CSV-данные в свой собственный список, а затем перебрать копию - это нормально, но кажется неэффективным.Понимание списка с CSV-объектом

Я в тупике.

Подозреваемый код:

import csv 

data_source = '/charts.csv' 
final_data = [] 
x_obs1 = [] 
y_obs1 = [] 
x_obs2 = [] 
y_obs2 = [] 

data_file = open(data_source, "r") 
final_data = csv.reader(data_file, delimiter=',') 

[(x_obs1.append(item[0]), y_obs1.append(item[1])) for item in final_data] 
[(x_obs2.append(item[0]), y_obs2.append(item[2])) for item in final_data] 

data_file.close() 

print y_obs2 

Возвращает: []

Это работает, как ожидалось:

import csv 

data_source = '/charts.csv' 
final_data = [] 
x_obs1 = [] 
y_obs1 = [] 
x_obs2 = [] 
y_obs2 = [] 

data_file = open(data_source, "r") 
csv_data = csv.reader(data_file, delimiter=',') 

[final_data.append(item) for item in csv_data] 

data_file.close() 

[(x_obs1.append(item[0]), y_obs1.append(item[1])) for item in final_data] 
[(x_obs2.append(item[0]), y_obs2.append(item[2])) for item in final_data] 

print y_obs2 

Возвращает: ['Barometric Pressure Normal', '30', '30', '30', '30', '30'....

Что мне не хватает? Любое понимание было бы наиболее оценено.

ответ

1

В принципе, csv.reader подходит только для одного файла csv. Во второй раз, когда вы пытаетесь выполнить итерацию по тому же csv.reader, он уже исчерпан, поэтому возвращает пустой список.

Итак, ваш второй случай - это более правильный способ делать то, что вам нужно. Он создает кэшированную копию CSV-данных без необходимости возвращаться через файл на диске (что относительно дорого).

+0

Красивые. Я понятия не имел, что объект csv.reader хорош на один ход и будет исчерпан. Где ты был вчера? Огромное спасибо! – DaveL17

+0

Добро пожаловать! Я провел много часов, царапая голову по подобным вопросам, поэтому очень рад помочь;) – srowland

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