TypeError:“ _ csv.reader”对象不可下标

时间:2018-08-02 03:09:42

标签: python python-3.x csv selenium web-crawler

#!/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上还很新,所以我问你的帮助人员

3 个答案:

答案 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 islice

la = 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')