今天寫**時,犯了乙個低階錯誤。但這個的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) 解決了該問題。
結論:檔案控制代碼不適合放在迴圈裡邊處理。如果非要這麼處理,要把檔案控制代碼指回檔案頭。
不過,這裡**寫的有點糙,完全可以一次開啟檔案全部處理,這樣就避免了的這個陷阱。
python操作控制代碼 關於檔案控制代碼的詳細介紹
檔案控制代碼的例項 通過控制代碼定位未見讀取的起始位置以及大檔案的分塊讀取為了使用讀檔案函式,需要使用相對於 php 指令碼的路徑為他們指出要讀取的檔案,然而,大多數php 的檔案函式使用一種稍有區別的機制訪問檔案,這種機制與連線資料庫的機制非常相似,該過程使用fopen 函式進行 連線 使用 fc...
檔案控制代碼和檔案控制代碼洩漏解決
在檔案i o中,要從乙個檔案讀取資料,應用程式首先要呼叫作業系統函式並傳送檔名,並選乙個到該檔案的路徑來開啟檔案。該函式取回乙個順序號,即檔案控制代碼 file handle 該檔案控制代碼對於開啟的檔案是唯一的識別依據。要從檔案中讀取一塊資料,應用程式需要呼叫函式readfile,並將檔案控制代碼...
perl 檔案控制代碼
控制代碼handle 分為檔案控制代碼和目錄控制代碼,檔案控制代碼實際上包含檔案,程序和套接字的讀寫。檔案控制代碼的操作步驟 open fd,filename lines close fd open 由以下幾個用法 open fd,filename 寫資料進檔案 open fd,filename 追...