【问题标题】:TypeError: '_csv.reader' object is not subscriptableTypeError:“_csv.reader”对象不可下标
【发布时间】:2019-01-09 17:06:47
【问题描述】:
#!/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 的新手,所以我想请你们帮忙

【问题讨论】:

  • listaluno 不是一个列表。你不能切片。

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


【解决方案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=';'))

更 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 或更多。如果您像第一种方法一样将其转换为列表,那么您将耗尽内存。生成器解决方案通过仅在需要时解析每一行来解决这个问题。此外,也许您不需要每一行都需要,并且您的程序或循环可以提前退出。通过不预加载甚至可能不会被利用的所有信息来节省工作量。这个概念通常被称为惰性求值

【讨论】:

    【解决方案2】:

    正如@juanpa.arrivillaga 正确建议的那样,listaluno 不是一个列表。它是一个迭代器。您应该将其转换为列表然后切片:

    for alunos in list(listaluno)[1:]:
        do_stuff()
    

    或者直接跳过第一次迭代:

    next(listaluno)
    for alunos in listaluno:
        do_stuff()
    

    【讨论】:

      【解决方案3】:

      你也可以使用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 是为了什么,但如果它只是为了编号,你也可以使用 enumerate 函数来做同样的事情

      导入 csv
      从 itertools 导入 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')

      【讨论】:

        猜你喜欢
        • 2014-02-26
        • 2021-03-02
        • 2016-07-20
        • 1970-01-01
        • 2017-07-15
        • 2021-10-01
        • 2019-12-07
        • 2012-01-09
        • 2021-11-23
        相关资源
        最近更新 更多