#!/usr/bin/python
# -*- coding: utf-8 -*-
import csv
la = open('loginscruz.csv', 'r')
listaluno = csv.reader(la,delimiter=';')
for alunos in listaluno[1:]:
num = 1
aluno = str(alunos[3])
if (aluno != ''):
print (aluno + " batata")
错误在for alunos in listaluno[1:]:
我在Python上还很新,所以我问你的帮助人员
答案 0 :(得分:1)
误解是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=';'))
更多的Python解决方案可能会跳过第一项而忽略它。
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或更大。如果要像第一种方法一样将其转换为列表,则将耗尽内存。生成器解决方案通过仅解析所需的每一行来解决此问题。此外,也许您不需要每行都 ,并且您的程序或循环可能会提前退出。通过不预加载所有可能无法利用的信息来节省精力。这个概念通常称为惰性评估。
答案 1 :(得分:0)
正如@ juanpa.arrivillaga正确建议的那样,listaluno
不是列表。它是一个迭代器。您应该将其转换为列表,然后切片:
for alunos in list(listaluno)[1:]:
do_stuff()
或者只是跳过第一轮迭代:
next(listaluno)
for alunos in listaluno:
do_stuff()
答案 2 :(得分:0)
您还可以使用itertools库,islice函数
import csv
from itertools import islice
la = open('loginscruz.csv', 'r')
listaluno = iter(csv.reader(la,delimiter=';'))
for listaluno in islice(listaluno ,1,None):
num = 1
aluno = str(listaluno[3])
if (aluno != ''):
print (f'{aluno} batata')
我不知道您使用nums = 1的用途是什么,但是如果仅出于编号目的,您也可以对同一对象使用枚举功能
import csv from itertools import islicela = open('loginscruz.csv', 'r') listaluno = iter(csv.reader(la,delimiter=';'))
for count, listaluno in enumerate(islice(listaluno,1,None), start = 1): aluno = str(listaluno[3])
if (aluno != ''): print (f'{count} {aluno} batata')