[英]Python Why use open(filename) twice in this code?
這是《機器學習在行動》第二章中的一段代碼。 目標是將文件傳輸到matix。 我不明白的是為什么我應該兩次使用fr = open(filename)?
當我刪除第二個open(filename)時,代碼僅返回空白矩陣。 我不知道為什么。
非常感謝您抽出寶貴的時間!
def file2matrix(filename):
fr = open(filename)
numberOfLines = len(fr.readlines())
returnMat = zeros((numberOfLines,3))
classLabelVector = []
fr = open(filename)
index = 0
for line in fr.readlines():
line = line.strip()
listFromLine = line.split('\t')
returnMat[index,:] = listFromLine[0:3]
classLabelVector.append(int(listFromLine[-1]))
index += 1
return returnMat,classLabelVector
它讀取文件兩次:
首先,它讀取所有行,然后對行進行計數並初始化矩陣:
fr = open(filename) numberOfLines = len(fr.readlines()) returnMat = zeros((numberOfLines,3))
其次,它再次讀取文件以填充矩陣:
fr = open(filename) index = 0 for line in fr.readlines(): line = line.strip() ...
並且它需要再次打開文件,以從頭開始重新讀取。
這不是有效的代碼。 由於fr.readlines()
讀取整個文件,因此無需再次讀取文件,而是將結果(行列表)存儲在變量中,並在填充矩陣時重用。
處理完文件后,還應該調用close()
。
當您使用readlines函數時,它將所有行讀入內存,並且在文件末尾,文件指針位於文件的末尾。
因此,如果您已經使用完后嘗試重新讀取行,由於文件指針位於末尾,它將從末尾到末尾讀取,因此為空白矩陣。
他們重新打開了文件,使文件指針又回到了開頭。 這樣做的另一種方法是filevariable.seek(0),它將文件指針移回起點,您應該能夠再次使用讀取行。
需要注意的一件事是,readlines會將整個文件讀入內存,如果您有一個龐大的文件,則應使用for循環並使用readline一次讀取一行。
現在建議在處理文件時始終使用上下文管理器。 請嘗試以下操作,它應該與您要尋找的非常接近。
def file2matrix(filename):
with open(filename, "r") as fr:
returnMat = zeros((len(fr.readlines,3))
classLabelVector = []
index = 0
for line in fr:
line = line.strip()
listFromLine = line.split('\t')
returnMat[index,:] = listFromLine[0:3]
classLabelVector.append(int(listFromLine[-1]))
index += 1
return returnMat,classLabelVector
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.