Python为什么在这段代码中使用open(filename)两次?

Python为什么在这段代码中使用open(filename)两次?,python,python-3.x,Python,Python 3.x,下面是第2章机器学习中的一段代码。 目标是将文件传输到matix。我不明白的是为什么我应该使用fr=open(filename)两次 当我删除第二个open(filename)时,代码只返回空白矩阵。我不明白为什么 非常感谢您抽出时间 def file2matrix(filename): fr = open(filename) numberOfLines = len(fr.readlines()) returnMat = zeros((numberOfLi

下面是第2章机器学习中的一段代码。 目标是将文件传输到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 = 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()

    它将文件读取两次:

  • 首先读取所有行,然后计算行数并初始化矩阵:

    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 = 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


    需要注意的一点是,readlines会将整个文件读入内存,如果您有一个大文件,则应该使用for循环,并使用readline一次读取一行。

    当您使用readlines函数时,它会将所有行读入内存,并且文件指针在文件的最后

    这样,如果您在使用它之后再次尝试读取,因为文件指针在末尾,它将从端到端读取,因此空白矩阵。

    他们重新打开文件,使文件指针回到开头。另一种方法是filevariable.seek(0),它将文件指针移回起始位置,您应该能够再次使用readlines


    需要注意的一点是,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
    

    现在建议在处理文件时始终使用上下文管理器。试试下面这个,它应该非常接近你要找的东西

    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
    

    可能重复的可能重复您还可以将枚举(行)中的i行的
    索引=0
    索引+=1
    更改为
    !我现在就试试!您还可以将i的
    索引=0
    索引+=1
    更改为
    枚举(行)
    行!我现在就试试!谢谢这对我帮助很大!谢谢这对我帮助很大!