我仍然在范围内得到IndexError

Kei*_*van 3 python csv indexoutofboundsexception

我试图读取csv文件的行.我的文件看起来像这样

Col 1, Col 2, Col3
row11, row12, row13
row21, row22, row23
row31, row32, row33
...
Run Code Online (Sandbox Code Playgroud)

我使用以下命令来读取行

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

输出打印第一行,但之后它立即给出索引错误.

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
Run Code Online (Sandbox Code Playgroud)

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

编辑:这是输出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'}]
Run Code Online (Sandbox Code Playgroud)

jwi*_*ner 5

DictReader(f)只是给你一次看你的文件 - 你只能打电话list一次,但你多次调用它,因为它在循环内.以后的呼叫返回空list.只需list在循环外调用它并将其保存在变量中,你就会变得金黄.

那是:

r = csv.DictReader(f)
rows = list(r)
for i in range(5):
    print(rows[i])
Run Code Online (Sandbox Code Playgroud)

或者,不要在任何时候将整个内容拉入内存:

for row in csv.DictReader(f):
    print row
Run Code Online (Sandbox Code Playgroud)

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

 for i, row in enumerate(csv.DictReader(f)):
     print i, row
Run Code Online (Sandbox Code Playgroud)

如果你想从一个iterator(这csv.DictReader是一个特例)得到特定的行而不将整个事物拉入内存,请itertools.islice访问https://docs.python.org/3/library/itertools.html.它基本上允许list样式切片iterator.

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

对于更多零星的行:

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