误解是listaluno实际上并不是一个列表。它是一个生成器,根据请求返回下一行。这意味着您不能使用[1:] 为其下标,因为这些行还没有被CSV 库解析——它们还不存在!您可以通过几种方式更改您的代码。考虑:
# Using the `list()` function will iterate through the generator and
# return the items as a list. In effect, it "converts" the generator
# to a list.
la = open('loginscruz.csv', 'r')
listaluno = list(csv.reader(la,delimiter=';'))
更 Pythonic 的解决方案可能会通过跳过第一项来忽略它。
la = open('loginscruz.csv', 'r')
listaluno = list(csv.reader(la,delimiter=';'))
next(listaluno)
for alunos in listaluno:
...
或许
la = open('loginscruz.csv', 'r')
listaluno = list(csv.reader(la,delimiter=';'))
for lineno, alunos in enumerate(listaluno):
if not lineno:
# enumerate counts from 0 by default, so on first iteration,
# lineno == 0, which is falsey
continue
...
最后,您应该避免使用list() 方法的一个论点:考虑您的 CSV 文件是否绝对巨大,例如 TB 或更多。如果您像第一种方法一样将其转换为列表,那么您将耗尽内存。生成器解决方案通过仅在需要时解析每一行来解决这个问题。此外,也许您不需要每一行都需要,并且您的程序或循环可以提前退出。通过不预加载甚至可能不会被利用的所有信息来节省工作量。这个概念通常被称为惰性求值。