今天写代码时,犯了一个低级错误。但这个的bug,很难发现。贴出有bug的代码,提醒自己。
def calc(fd,type):
normal_obj_num = 0
all_obj_num = 0
#fd.seek(0)
for line in fd:
arr=line.split()
if arr[1] == type:
line_obj_num=0
line_obj_num=int(arr[3])+int(arr[4])+int(arr[5])
all_obj_num+=line_obj_num
normal_obj_num+=int(arr[3])
return normal_obj_num/1.0/all_obj_num
def calc_rate(fd):
type_list=['renwu_psaladin','high_freq','high_risk']
for i in range(len(type_list)):
rate=0
rate=calc(fd,type_list[i])
print "normal obj rate for %s is %f" %(type_list[i],rate)
if __name__ == '__main__':
file_name=sys.argv[1]
fd=open(file_name)
calc_rate(fd)
fd.close()
这段代码是统计一个文件,正常obj的数目占总obj的数目。但文件的记录分为三类,所以放到一个list。本想,遍历这个list,分别统计没个类别的正常obj的占比。但是发现计算第一个类型后,第二次就出错了。
问题处在哪呢? 调试了老半天,发现原来,文件句柄哪里出错了。 第一次执行完毕时,已经读到了文件的末尾。 所以,再次执行时,需要seek到文件开头。加一行代码,fd.seek(0) 解决了该问题。
结论:文件句柄不适合放在循环里边处理。如果非要这么处理,要把文件句柄指回文件头。
不过,这里代码写的有点糙,完全可以一次打开文件全部处理,这样就避免了的这个陷阱。