用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'....

我错过了什么?任何见解都将不胜感激。

基本上,csv.reader只适用于一次遍历csv文件。第二次尝试对同一个csv.reader进行迭代时,它已经用完了,因此返回一个空列表。

所以你的第二种情况是做你需要的事情的更正确的方式。它创建CSV数据的缓存副本,而不需要通过磁盘上的文件返回(这相对昂贵)。

最新更新