2016-04-12 13 views
1

私はPython 2.6でCSVオブジェクトから2つの単純なリストを構築しようとしています。すべてのテストで、2番目に生成されたリストは常に空になります(最初に生成されたリストはきれいに戻ります)。2番目のリストの理解が最初のものが終了する前に開始しているかのようです。このコードを期待どおりに実行させるための唯一の方法は、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ファイルでのみ有効です。 2回目の試行で、同じcsv.readerを繰り返し処理すると、すでに使い果たされているので、空のリストを返します。

2番目のケースでは、必要な作業をより正確に行うことができます。これは、ディスク上のファイルを元に戻す必要なく、CSVデータのキャッシュされたコピーを作成します(比較的高価です)。

+0

美しい。私は、csv.readerオブジェクトが1つの目的には良いことを知らず、疲れてしまいました。あなたは昨日どこにいましたか?どうもありがとう! – DaveL17

+0

大歓迎です!私は似たような問題で頭を何度も悩ましてきたので、本当にうれしいです;) – srowland

関連する問題