Python执行print(list(map对象))语句后触发IndexError异常问题求助
问题根因解析
迭代器单次消耗特性
Python 3 中map()函数返回的是迭代器对象,而非列表。迭代器仅支持单次遍历,所有元素被读取一次后就会被清空,无法重复读取。
你在print(list(arrNSEGSMList))这一步已经把map返回的迭代器里的所有元素全部消耗完了,后续再执行list(arrNSEGSMList)只能拿到空列表,转换得到的numpy数组就是长度为0的空数组,删除第0行自然会触发索引越界的报错。
删除print语句后,迭代器没有被提前消耗,第一次转list就能拿到完整数据,所以可以正常执行。存在变量名笔误
你代码中arrNSEGSMList = numpy.array(list(arrNSEGSMList1))里的arrNSEGSMList1是未定义的变量,这属于笔误,实际应该替换为你之前定义的arrNSEGSMList,否则即使解决了迭代器的问题也会触发NameError。
修复方案
直接在生成map结果时就转为列表存储,避免使用迭代器:
import requests import numpy objNSEResponse = requests.get("https://www.nseindia.com" , headers = { "Referer":"https://www.nseindia.com" , "User-Agent":"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)"}) objNSECookieJar = objNSEResponse.cookies objNSEResponse = requests.get("https://www.nseindia.com/api/reportGSM?csv=true" , headers = {"Referer":"https://www.nseindia.com" , "User-Agent":"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)"} , cookies = objNSECookieJar) # 把原map行修改为下方代码,直接存列表而非迭代器 arrNSEGSMList = list(map(lambda arrNSEGSMRecord : arrNSEGSMRecord.replace("\"","").split(","), objNSEResponse.content.decode("utf-8-sig").replace("\n\"","\"").split("\n"))) print(arrNSEGSMList) # 后续直接用变量即可,不需要再转list arrNSEGSMList = numpy.array(arrNSEGSMList) arrNSEGSMList = numpy.delete(arrNSEGSMList, [0], axis=0) # delete header row arrNSEGSMList = numpy.delete(arrNSEGSMList, [2,3,4], axis=1) # delete all columns except stock symbol and serial number
内容的提问来源于stack exchange,提问作者Aadee Maanav
相关产品推荐
相关产品推荐

