【问题标题】:unable to iterate through csv DictReader more than once [duplicate]无法多次遍历 csv DictReader [重复]
【发布时间】:2015-05-25 00:17:49
【问题描述】:

在 Python(2.7.6) 中,我试图从 CSV 文件的某些列中获取列表。给定 CSV 文件 test.csv 的内容:

COL_ONE,COL_TWO,COL_THREE
val_R1C1,val_R1C2,val_R1C3
val_R2C1,val_R2C2,val_R2C3
val_R3C1,val_R3C2,val_R3C3
val_R4C1,val_R4C2,val_R4C3

我希望下面的代码可以为我做这件事:

import csv

reader = csv.DictReader(open("test.csv", "r"))
col2 = list(c2['COL_TWO'] for c2 in reader)
col3 = list(c3['COL_THREE'] for c3 in reader)

不幸的是,当我打印两个列表 col2 和 col3 时,第二个列表是空的。

['val_R1C2', 'val_R2C2', 'val_R3C2', 'val_R4C2']
[]

这个替代方案具有相同的结果:

reader = csv.DictReader(open("test.csv", "r"))
col2 = []
for c2 in reader:
    col2.append(c2['COL_TWO'])
col3 = []
for c3 in reader:
    col3.append(c3['COL_THREE'])

解决方法很简单:

col2 = []
col3 = []
for cval in reader:
    col2.append(cval['COL_TWO'])
    col3.append(cval['COL_THREE'])

我得到了我在前两个示例中所期望的结果:

['val_R1C2', 'val_R2C2', 'val_R3C2', 'val_R4C2']
['val_R1C3', 'val_R2C3', 'val_R3C3', 'val_R4C3']

如果能帮助我理解我做错了什么,我将不胜感激。为什么我在所有三种情况下都没有得到相同的结果?

【问题讨论】:

标签: python list python-2.7 csv


【解决方案1】:

将底层文件倒回到读取之间的 0 位置:

import csv

fh = open("test.csv", "r")
reader = csv.DictReader(fh)
next(reader) # skip header row
col2 = list(c2['COL_TWO'] for c2 in reader)
fh.seek(0)  ## <------------------- this is the point
next(reader) # skip header row
col3 = list(c3['COL_THREE'] for c3 in reader)

【讨论】:

  • 当我运行这段代码然后打印 col2 和 col3 我得到: ['val_R1C2', 'val_R2C2', 'val_R3C2', 'val_R4C2'] ['COL_THREE', 'val_R1C3', 'val_R2C3 ', 'val_R3C3', 'val_R4C3']
  • 您没有显示至少部分代码,您正在跳过文件的第一行;我将编辑我的答案以提供这一点,但请查看发生这种情况的代码...
  • logc,感谢您的解释。实际上,我展示的代码是完整的,除了最后的两个打印语句。你显示的代码给了我['val_R2C2', 'val_R3C2', 'val_R4C2']['val_R1C3', 'val_R2C3', 'val_R3C3', 'val_R4C3'] 如果我删除第一个next 语句,我会得到想要的结果。
猜你喜欢
  • 2014-03-01
  • 2019-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-17
  • 1970-01-01
  • 1970-01-01
  • 2018-03-22
相关资源
最近更新 更多