使用 CSV 对象列出理解行为

List Comprehension Behavior with a CSV Object

我正在尝试从 Python 2.6 中的 CSV 对象构造两个简单列表。在我所有的测试中,第二个生成的列表总是 returns 为空(第一个生成的列表 returns 很好。)这几乎就像第二个列表理解在第一个列表完成之前开始。我可以按预期将此代码设为 运行 的唯一方法是将 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

Returns: []

这按预期工作:

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

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

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

基本上,csv.reader 仅适用于一次浏览 csv 文件。第二次尝试迭代相同的 csv.reader,它已经用完了,所以 returns 一个空列表。

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