2016-04-12 1 views
1

Je tente de construire deux listes simples à partir d'un objet CSV dans Python 2.6. Dans tous mes tests, la deuxième liste générée retourne toujours vide (la première liste générée renvoie très bien). C'est presque comme si la deuxième liste commençait avant que la première soit terminée. La seule façon d'exécuter ce code comme prévu est de copier les données CSV dans sa propre liste, puis d'itérer la copie - ce qui est correct, mais semble inefficace.Comportement de compréhension de liste avec un objet CSV

Je suis perplexe.

Le code suspect:

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 

Retours: []

Cela fonctionne comme prévu:

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 

Retours: ['Barometric Pressure Normal', '30', '30', '30', '30', '30'....

Qu'est-ce que je manque? Toute idée serait la plus appréciée.

Répondre

1

Fondamentalement, csv.reader est bon pour un seul passage à travers le fichier csv seulement. La deuxième fois que vous essayez d'itérer sur le même csv.reader, il a déjà été épuisé, retourne donc une liste vide.

Alors votre deuxième cas est la façon la plus correcte de faire ce dont vous avez besoin. Il crée une copie en mémoire cache des données CSV sans avoir à revenir en arrière sur le fichier (ce qui est relativement coûteux).

+0

Belle. Je n'avais aucune idée que l'objet csv.reader était bon pour un aller et serait épuisé. Où étais-tu hier? Merci beaucoup! – DaveL17

+0

Vous êtes les bienvenus! J'ai passé de nombreuses heures à me gratter la tête à des problèmes similaires, donc vraiment heureux d'aider;) – srowland