为什么python每次使用数据时都需要打开文件?

时间:2016-07-14 03:20:12

标签: python function built-in

下面的代码有两条相同的行,但我认为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

1 个答案:

答案 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