下面的代码有两条相同的行,但我认为fr已经被第一行打开了。我尝试删除第二行,但代码失败。那么为什么我们每次使用它时都需要打开文件呢?
def file2matrix(filename):
fr = open(filename) #<-------------------------
numberOfLines = len(fr.readlines())
returnMat = np.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(listFromLine[-1])
index += 1
return returnMat, classLabelVector
答案 0 :(得分:1)
您无需重新打开该文件,但确实需要返回到开头。
readline()函数读取文件中的一行。每次调用readline()时,指针都会移动到下一行。
readlines()调用readline()直到它到达文件末尾。如果要返回到开头,则需要重新打开该文件。 (一般来说,最好先关闭然后重新打开文件。即使你只读了一次,也应该在最后关闭文件。)
如果您只想浏览一次文件,可以在浏览文件时计算行数,然后返回该数字。
原件:
def file2matrix(filename):
fr = open(filename)
numberOfLines = len(fr.readlines())
returnMat = np.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(listFromLine[-1])
index += 1
return returnMat, classLabelVector
另一种方式:
def file2matrix(filename):
fr = open(filename)
classLabelVector = []
index = 0
line = ''
numberOfLines = 0
while line is not None:
numberOfLines += 1
line = fr.readline()
listFromLine = line.split('\t')
returnMat[index,:] = listFromLine[0:3]
classLabelVector.append(listFromLine[-1])
index += 1
fr.close()
returnMat = np.zeros((numberOfLines,3))
return returnMat, classLabelVector