python文件句柄的使用

今天写代码时,犯了一个低级错误。但这个的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) 解决了该问题。

 

结论:文件句柄不适合放在循环里边处理。如果非要这么处理,要把文件句柄指回文件头。

 

不过,这里代码写的有点糙,完全可以一次打开文件全部处理,这样就避免了的这个陷阱。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值