我在范围内时收到 IndexError
I get IndexError while still in the range
我正在尝试读取 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])
输出打印了第一行,但紧接着它给出了超出索引的错误。
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'}]
DictReader(f)
只让您一次性查看您的文件——您只能对它调用一次 list
,但您可以多次调用它,因为它在循环中。稍后调用 return 一个空的 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
如果您想从 iterator
(csv.DictReader
是一个特例)中获取特定的行而不将整个内容拉入内存,请查看 itertools.islice
https://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
我正在尝试读取 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])
输出打印了第一行,但紧接着它给出了超出索引的错误。
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'}]
DictReader(f)
只让您一次性查看您的文件——您只能对它调用一次 list
,但您可以多次调用它,因为它在循环中。稍后调用 return 一个空的 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
如果您想从 iterator
(csv.DictReader
是一个特例)中获取特定的行而不将整个内容拉入内存,请查看 itertools.islice
https://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