首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > perl python >

[D]关于IndexError: list index out of range 的有关问题

2012-04-09 
[D]关于IndexError: list index out of range 的问题我编了个小程序 读取文件数据,运行时总提示IndexError

[D]关于IndexError: list index out of range 的问题
我编了个小程序 读取文件数据,运行时总提示IndexError: list index out of range ,我仔细检查了,索引并没有越界啊,还有其他原因导致这个错误吗 代码太长了 贴出部分代码 希望大家帮忙看看 感激不尽  

Python code
    file1=open('%s' % mgt)    #从mgt文件中读取信息    global line1    line1=[]    global line1num    line1num=0    for eachline in file1.readlines():        line1.append(eachline)        line1num+=1          global components    components=[]    global compnum    compnum=0    i=0    cps=0    cpo=0    while i<line1num:        if line1[i]=='*MEMBER    ; Member'+'\n':            cps=i+1            break        i+=1    cpt=cps    if cpt!=0:        while cpt<line1num:            if line1[cpt]=='\n':                cpo=cpt                break            cpt+=1    j=0    while cps<cpo:        line1[cps]=line1[cps].strip()        r=re.compile(',')        comdata=[]        comdata=r.split(line1[cps])        components.append([])        i=0        while i<len(comdata):            components[j].append(comdata[i])            i+=1        j+=1        compnum+=1        cps+=1    for each in components:        each.pop(1)    file7=open('%s' % rcs1)    #从rcs文件中读取信息    #此时line2不是全局变量    line2=[]    line2num=0    for eachline in file7.readlines():        line2.append(eachline)        line2num+=1    file7.close()    combeamnum=0     line3=[]     line3num=0      line5=[]      line6=[]      line7=[]     line8=[]     i=0    while i<line2num:        if line2[i].count('kN, m')!=0:            cb=i+1            break        i+=1        ct=cb         if ct!=0:        while ct<line2num:            if line2[ct].count('=')==3:                line3.append(line2[ct])                line3num+=1            if line2[ct].count('=')==2:                line3.append(line2[ct])                line3num+=1            if line2[ct].count('@')!=0:                line3.append(line2[ct])                line3num+=1                ct+=1        i=0    while i<line3num:        line3[i]=line3[i].strip()        line3[i+1]=line3[i+1].strip()        line3[i+2]=line3[i+2].strip()        line3[i+3]=line3[i+3].strip()        line3[i+4]=line3[i+4].strip()        line3[i+5]=line3[i+5].strip()        r=re.compile(' *')    #利用正则表达式,' *'对应' ','  ','   ','    '这一类        line4data=[]        line4data1=[]        line4data2=[]        line4data3=[]        line4data4=[]        line4data5=[]        line4data=r.split(line3[i])        line4data1=r.split(line3[i+1])        line4data2=r.split(line3[i+2])        line4data3=r.split(line3[i+3])        line4data4=r.split(line3[i+4])        line4data5=r.split(line3[i+5])        line4data[2]=line4data[2].strip()        line4data[2]=line4data[2].rstrip(',')        line4data[5]=line4data[5].strip()        line5.append([int(line4data[2])])        line5[i].append(int(line4data[5]))        line4data1[2]=line4data1[2].strip()        line4data1[2]=line4data1[2].rstrip(',')        line4data1[5]=line4data1[5].strip()        line5.append([float(line4data1[2])])        line5[i+1].append(float(line4data1[5]))        line4data2[5]=line4data2[5].strip()        line4data2[5]=line4data2[5].rstrip(',')        line4data2[5]='HRB'+str(int(line4data2[5])/1000)        line5.append([line4data2[5]])        line4data3[5]=line4data3[5].strip()        line4data3[6]=line4data3[6].strip()        line4data3[6]=line4data3[6].split('-')        line4data3[6][1]=line4data3[6][1].lstrip('d')        line4data3[10]=line4data3[10].strip()        line4data3[11]=line4data3[11].strip()        line4data3[11]=line4data3[11].split('-')        line4data3[11][1]=line4data3[11][1].lstrip('d')        line5.append([float(line4data3[5])])        line5[i+3].append(int(line4data3[6][0]))        line5[i+3].append(int(line4data3[6][1]))        line5[i+3].append(float(line4data3[10]))        line5[i+3].append(int(line4data3[11][0]))        line5[i+3].append(int(line4data3[11][1]))        line4data4[5]=line4data4[5].strip()        line4data4[6]=line4data4[6].strip()        line4data4[6]=line4data4[6].split('-')        line4data4[6][1]=line4data4[6][1].lstrip('d')        line4data4[10]=line4data4[10].strip()        line4data4[11]=line4data4[11].strip()        line4data4[11]=line4data4[11].split('-')        line4data4[11][1]=line4data4[11][1].lstrip('d')        line5.append([float(line4data4[5])])        line5[i+4].append(int(line4data4[6][0]))        line5[i+4].append(int(line4data4[6][1]))        line5[i+4].append(float(line4data4[10]))        line5[i+4].append(int(line4data4[11][0]))        line5[i+4].append(int(line4data4[11][1]))        line4data5[5]=line4data5[5].strip()        line4data5[6]=line4data5[6].strip()        line4data5[6]=line4data5[6].split('-')        line4data5[6][1]=line4data5[6][1].lstrip('d')        line4data5[10]=line4data5[10].strip()        line4data5[11]=line4data5[11].strip()        line4data5[11]=line4data5[11].split('-')        line4data5[11][1]=line4data5[11][1].lstrip('d')        line5.append([float(line4data5[5])])        line5[i+5].append(int(line4data5[6][0]))        line5[i+5].append(int(line4data5[6][1]))        line5[i+5].append(float(line4data5[10]))        line5[i+5].append(int(line4data5[11][0]))        line5[i+5].append(int(line4data5[11][1]))        i+=6    i=0    j=0    while j<len(line5):        line6.append([])        line6[i]=line5[j]+line5[j+1]+line5[j+2]+line5[j+3]            line7.append([])        line7[i]=line5[j]+line5[j+1]+line5[j+2]+line5[j+4]        line8.append([])        line8[i]=line5[j]+line5[j+1]+line5[j+2]+line5[j+5]        combeamnum+=1        i+=1        j+=6        j=0    print line6    print len(line6)    print combeamnum        print components    print len(components)    print compnum    while j<combeamnum:        if section[int(line6[j][1])-1][1]=='SB':               B=float(line6[j][2])                                H=float(line6[j][3])            if B==0.1:                B=0.1001            if H==0.1:                H=0.1001            k=0             while k<compnum:                if int(components[k][0])==int(line6[j][0]):    #根据单元来对应截面,然后求得等效截面                    if len(components[k])==1:    #梁没有被分割                        if int(line6[j][5])+int(line6[j][8])<int(line8[j][5])+int(line8[j][8]):....下面还很长 不贴出来了 运行后 结果是[[1, 1, 0.25, 0.5998, 'HRB335', 0.000297, 2, 20, 0.00029997, 2, 20], [2, 1, 0.25, 0.598, 'HRB335', 0.000501, 2, 20, 0.0002997, 2, 20], [3, 1, 0.25, 0.5998, 'HRB335', 0.0005001, 2, 20, 0.00029997, 2, 20], [4, 1, 0.25, 0.5998, 'HRB335', 0.0005001, 2, 20, 0.0002997, 2, 20], [5, 1, 0.25, 0.5998, 'HRB335', 0.00050001, 2, 20, 0.00040002, 2, 20], [6, 1, 0.25, 0.5998, 'HRB335', 0.0002997, 2, 20, 0.0002997, 2, 20], [7, 1, 0.25, 0.5998, 'HRB335', 0.000297, 2, 20, 0.0002997, 2, 20], [8, 1, 0.25, 0.59998, 'HRB335', 0.00998, 3, 20, 0.00029997, 2, 20]]88[['1', ' 571', ' 572'], ['2', ' 603', ' 604'], ['3', ' 635', ' 636'], ['4', ' 673', ' 674'], ['5', ' 559', ' 560'], ['6', ' 201'], ['7', ' 213'], ['8', ' 661', ' 662'], ['9', ' 544', ' 546'], ['10', ' 227'], ['11', ' 239'], ['12', ' 648', ' 650'], ['13', ' 543', ' 545'], ['14', ' 583', ' 584'], ['15', ' 615', ' 616'], ['16', ' 647', ' 649'], ['17', ' 570', ' 569'], ['18', ' 558', ' 557'], ['19', ' 542', ' 541'], ['20', ' 574', ' 573'], ['21'], ['22', ' 548', ' 547']]2222Exception in Tkinter callbackTraceback (most recent call last):  File "D:\Program Files\Python25\lib\lib-tk\Tkinter.py", line 1403, in __call__    return self.func(*args)  File "C:/Users/caizhen/Desktop/M2A0404调试.py", line 9970, in r5progress    compbeamsecbar()  File "C:/Users/caizhen/Desktop/M2A0404调试.py", line 1869, in compbeamsecbar    if int(components[k][0])==int(line6[j][0]):    #根据单元来对应截面,然后求得等效截面 

IndexError: list index out of range

上面列表信息为line6和components,说明读取文件信息没问题,但为什么总提示
  if int(components[k][0])==int(line6[j][0]): #根据单元来对应截面,然后求得等效截面
IndexError: list index out of range
应该没有索引越界啊,还有其他原因导致这个错误码,我想了好几天了,都没找出问题原因,非常着急,

麻烦大家帮我看看,感激不尽,

-----------
Double行动:
原帖分数:80
加分:80

[解决办法]
已经告诉你索引越界,那就去确认报错那行4个下标到底哪个有问题,譬如你认为kj没问题,那还有components[k]或line6[j]只是个空列表时,索引0也会报错...
[解决办法]
在报错的那行前面多打点log,自己调试嘛,应该很容易找到的。你这代码写的一堆怎么看啊
[解决办法]
1.这个不像pythoner写的程序,像c/c++程序员写的,有点儿啰嗦,而且全局变量用的太乱

if int(components[k][0])==int(line6[j][0]): #根据单元来对应截面,然后求得等效截面

2.如果是这行的错误,你在这行之前print components 和 line6出来看内容,有可能[k]或者[j]之后是个空list,你[0]就会出错;也有可能[k]或者[j]本身就已经出错,下标错误编译器不会误报的.只能多打log出来调试.

3.建议你重新梳理一遍流程,重新写个流程清晰的代码,自己调试也方便些.

[解决办法]
打印数据的方式不是很好看的也头痛,既然知道是越界,你可以在报错行前加下面用assert语句,那就清楚知道哪一个下标有问题...
assert len(components) > k
assert len(components[k]) > 0
assert len(line6) > j
assert len(line6[j]) > 0
[解决办法]
探讨

我将components和line6打印出来后没有发现空list,我是编程新手,麻烦问一下多打点log是什么意思啊?怎么操作啊?

[解决办法]
这个报错,不用想了,肯定的列表哪里出错了,里面没元素,你又使用了列表里面的元素,你在使用了列表的地方log下
[解决办法]
那就是j越界嘛,while j<len(line6):这一块全部贴出来吧,也许你在while k<len(components):里就改动了j。不是未知边界,还是用for循环好点,用while可忘记或做错递增...
[解决办法]
assert还可以打印出更详细的信息,例如

assert len(line6)>j, "line6 = %s, j = %d" % (line6, j)

热点排行