簡體   English   中英

Python為什么在此代碼中兩次使用open(filename)?

[英]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

它讀取文件兩次:

  1. 首先,它讀取所有行,然后對行進行計數並初始化矩陣:

     fr = open(filename) numberOfLines = len(fr.readlines()) returnMat = zeros((numberOfLines,3)) 
  2. 其次,它再次讀取文件以填充矩陣:

     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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM