【问题标题】:I get IndexError while still in the range我仍然在范围内时收到 IndexError
【发布时间】:2015-06-15 17:35:52
【问题描述】:

我正在尝试读取 csv 文件的行。我的文件是这样的

Col 1, Col 2, Col3
row11, row12, row13
row21, row22, row23
row31, row32, row33
...

我使用以下命令读取行

with open('~/data.csv') as f:
    r = csv.DictReader(f)
    for i in range(5):
        print(list(r)[i])

输出打印第一行,但之后立即给出 out of index 错误。

IndexError                                Traceback (most recent call last)
<ipython-input-15-efcc4f8c760d> in <module>()
      2     r = csv.DictReader(f)
      3     for i in range(5):
----> 4         print(list(r)[i])

IndexError: list index out of range

我猜我在某个地方犯了一个愚蠢的错误,但无法发现它。关于我做错了什么以及如何解决它的任何想法?

编辑:这是print(list(r))的输出:

[{'Col 1': 'row11', ' Col3': ' row13', ' Col 2': ' row12'}, {'Col 1': 'row21', ' Col3': ' row23', ' Col 2': ' row22'}, {'Col 1': 'row31', ' Col3': ' row33', ' Col 2': ' row32'}, {'Col 1': 'row41', ' Col3': ' row43', ' Col 2': ' row42'}, {'Col 1': 'row51', ' Col3': ' row53', ' Col 2': ' row52'}, {'Col 1': 'row61', ' Col3': ' row63', ' Col 2': ' row62'}, {'Col 1': 'row71', ' Col3': ' row73', ' Col 2': ' row72'}, {'Col 1': 'row81', ' Col3': ' row83', ' Col 2': ' row82'}, {'Col 1': 'row91', ' Col3': ' row93', ' Col 2': ' row92'}, {'Col 1': 'row101', ' Col3': ' row103', ' Col 2': ' row102'}]

【问题讨论】:

  • print(list(r)) 长什么样子?

标签: python csv indexoutofboundsexception


【解决方案1】:

DictReader(f) 只是让您一次性查看您的文件——您只能在其上调用list 一次,但您可以多次调用它,因为它在循环中。稍后的调用返回一个空的list。只需在循环外调用list 并将其保存在变量中,您就可以了。

即:

r = csv.DictReader(f)
rows = list(r)
for i in range(5):
    print(rows[i])

或者,不要在任何时候把整个事情都拉到内存中:

for row in csv.DictReader(f):
    print row

如果您想保留索引以用于其他目的:

 for i, row in enumerate(csv.DictReader(f)):
     print i, row

如果您想从iteratorcsv.DictReader 是一个特例)中获取特定行而不将整个内容拉入内存,请查看itertools.islicehttps://docs.python.org/3/library/itertools.html。它基本上允许在iterator 上进行list 样式的切片。

  # prints first five rows
  for row in itertools.islice(csv.DictReader(f), 5):
       print row

更多零星行:

  needed_row_indices = {2, 5, 20}
  for i, row in enumerate(csv.DictReader(f)):
      if i in needed_row_indices:
          print row

【讨论】:

  • 非常感谢,虽然这适用于一个小例子,但我的问题是我正在处理一个大约 10Gb 的大数据集。关于如何避免加载整个内容的任何想法?
  • 已更新以展示如何避免将整个内容拖入内存。 @Keivan
  • 再次感谢您。您是否对如何以这种方式读取文件的几个特定行有一些想法?那最初是我的问题,我试图简化它,所以我到了这一点。这解决了我上面提出的问题。
  • @Keivan 查看itertools,我在帖子中稍作解释。
  • @Keivan,如果您需要的行更分散地分布,我建议您 a) 构建一组您需要的行 - 例如,needed_rows = {2, 5, 20} - 然后 b ) 将上述示例与enumerate 一起使用,但仅在i in needed_rows 时才作用于行
猜你喜欢
  • 2011-09-19
  • 2015-02-06
  • 1970-01-01
  • 2020-08-18
  • 1970-01-01
  • 2021-07-26
  • 2011-11-30
  • 2021-04-28
  • 2019-12-09
相关资源
最近更新 更多