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

caizhen1988911 2012-04-04 04:14:39
我编了个小程序 读取文件数据,运行时总提示IndexError: list index out of range ,我仔细检查了,索引并没有越界啊,还有其他原因导致这个错误吗 代码太长了 贴出部分代码 希望大家帮忙看看 感激不尽
    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]]
8
8
[['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']]
22
22
Exception in Tkinter callback
Traceback (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
...全文
11966 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
caizhen1988911 2012-04-07
  • 打赏
  • 举报
回复
真的非常非常感谢大家的解答和帮助!我找到问题所在了,好像是循环顺序不对,我将k和j的循环顺序交换后,程序可以运行了,
panghuhu250 2012-04-06
  • 打赏
  • 举报
回复
assert还可以打印出更详细的信息,例如

assert len(line6)>j, "line6 = %s, j = %d" % (line6, j)
angel_su 2012-04-06
  • 打赏
  • 举报
回复
那就是j越界嘛,while j<len(line6):这一块全部贴出来吧,也许你在while k<len(components):里就改动了j。不是未知边界,还是用for循环好点,用while可忘记或做错递增...
caizhen1988911 2012-04-06
  • 打赏
  • 举报
回复
j=0
while j<len(line6):
if section[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<len(components):
assert len(components)>k
assert len(components[k])>0
assert len(line6)>j
assert len(line6[j])>0
if components[k][0]==line6[j][0]:
以上为程序部分代码,程序运行时提示:File "C:\Users\caizhen\Desktop\0406配筋调试.py", line 1885, in compbeamsecbar
assert len(line6)>j
AssertionError
我感觉这里错误提示有问题,因为所贴代码第二行循环时while j<len(line6):说明j<len(line6),但是错误却提示的意思是j<len(line6)不正确,
我同时也在使用列表的地方log了,很奇怪,打印出来的列表仔细检查了,里面没有空白的列表,

libralibra 2012-04-05
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

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

多打log就是

# 这2行就是log了
print components,len(components)
print line6,len(line6)

# 怀疑下面这行有问题
if int(components[k][0])==int(line6[j][0]): #根据单元来对应截面,然后求得等效截面
bijie521yl 2012-04-05
  • 打赏
  • 举报
回复
这个报错,不用想了,肯定的列表哪里出错了,里面没元素,你又使用了列表里面的元素,你在使用了列表的地方log下
angel_su 2012-04-04
  • 打赏
  • 举报
回复
打印数据的方式不是很好看的也头痛,既然知道是越界,你可以在报错行前加下面用assert语句,那就清楚知道哪一个下标有问题...
assert len(components) > k
assert len(components[k]) > 0
assert len(line6) > j
assert len(line6[j]) > 0
caizhen1988911 2012-04-04
  • 打赏
  • 举报
回复
我将components和line6打印出来后没有发现空list,我是编程新手,麻烦问一下多打点log是什么意思啊?怎么操作啊?
libralibra 2012-04-04
  • 打赏
  • 举报
回复
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.建议你重新梳理一遍流程,重新写个流程清晰的代码,自己调试也方便些.
zengna_com 2012-04-04
  • 打赏
  • 举报
回复
在报错的那行前面多打点log,自己调试嘛,应该很容易找到的。你这代码写的一堆怎么看啊
angel_su 2012-04-04
  • 打赏
  • 举报
回复
已经告诉你索引越界,那就去确认报错那行4个下标到底哪个有问题,譬如你认为kj没问题,那还有components[k]或line6[j]只是个空列表时,索引0也会报错...

37,743

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • WuKongSecurity@BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧