我可能会错过这里显而易见的事情,如果是这样,请原谅那个菜鸟(我是)的问题。我试图遍历文本文件中的行。第一个for
工作正常;但是,第二个for
没有。 print(eachLine)
命令不打印任何内容,newY
列表的结果是空白列表(因为它已初始化)。我所做的所有调试(下面只是最新的)都指出第二个for
根本没有被访问过。我在这里缺少什么?
编辑:有一个类似的问题here,但在那个问题中有嵌套循环,错误是用户指的是相同的 嵌套循环中同一文件中的行。我试图从头开始重新遍历文件。
import os
os.chdir ('d:\Documente\python tests')
def plotRegression(myFile):
lineCounter=0
sumX=0
sumY=0
sumXY=0
sumX2=0
newY=[]
for eachLine in myFile:
coords=eachLine.split()
lineCounter=lineCounter+1
sumX=sumX+float(coords[0])
sumY=sumY+float(coords[1])
sumXY=sumXY+float(coords[0])*float(coords[1])
sumX2=sumX2+float(coords[0])**2
avgX=sumX/lineCounter
avgY=sumY/lineCounter
m =(sumXY-lineCounter*avgX*avgY)/(sumX2-lineCounter*avgX**2)
for eachLine in myFile:
print (eachLine)
coords=eachLine.split()
newY.append(avgY+m*(coords[0]-avgX))
return (avgX, avgY,sumXY, sumX2, m, newY)
def Main():
dataFile = open("labdata.txt","r")
print (plotRegression(dataFile))
dataFile.close()
Main()
答案 0 :(得分:3)
您需要使用file.seek()
将文件阅读位置快退:
myFile.seek(0)
文件是流;从文件读取或写入文件会将文件指针前进到新位置。迭代文件以逐行读取也不例外。一旦您读取了文件中的所有行,文件位置就会一直保留在最后,再次迭代不会产生任何其他信息。
最好处理文件中的所有信息并将其存储在内存中,只需一次即可。与访问内存中的相同信息相比,文件读取是一个缓慢的过程。在这种情况下,您只需要使用每行的第一个值;在第一个循环中读取时存储:
x_coords = []
for eachLine in myFile:
x, y = (float(c) for c in eachLine.split())
lineCounter += 1
x_coords.append(x)
sumX += x
sumY += y
sumXY += x * y
sumX2 += x ** 2
avgX = sumX / lineCounter
avgY = sumY / lineCounter
m = (sumXY - lineCounter * avgX * avgY) / (sumX2 - lineCounter * avgX ** 2)
for x in x_coords:
newY.append(avgY + m * (x - avgX))