2013-06-06 87 views
0

我目前在一些truble关于巨蟒和读取文件读取文件。我必须在while循环中打开一个文件,并用文件的值做一些事情。结果写入一个新文件。然后在while循环的下一次运行中读取这个新文件。但在第二次运行中,我没有从这个文件中得到任何值......这是一段代码,希望能够澄清我的意思。的Python在while循环

while convergence == 0: 
    run += 1 
    prevrun = run-1 

    if os.path.isfile("./Output/temp/EmissionMat%d.txt" %prevrun) == True: 
     matfile = open("./Output/temp/EmissionMat%d.txt" %prevrun, "r") 
     EmissionMat = Aux_Functions.EmissionMat(matfile) 
     matfile.close() 
    else: 
     matfile = open("./Input/EmissionMat.txt", "r") 
     EmissionMat = Aux_Functions.EmissionMat(matfile) 
     matfile.close() 

    # now some valid operations, which produce a matrix 

    emissionmat_file = open("./output/temp/EmissionMat%d.txt" %run, "w") 
    emissionmat_file.flush() 
    emissionmat_file.write(str(matrix)) 

    emissionmat_file.close() 

解决它!

matfile.seek(0) 

这将指针重置为文件的开头,并允许我在下一次运行中正确读取文件。


+0

你为什么'emissionmat_file.flush()'写作之前,什么是您使用的是什么操作系统'matrix' – njzk2

+0

的内容? – interjay

+0

@interjay我正在使用Win7。 – swot

回答

1

为什么写一个文件,然后看了吗?此外,你使用刷新,所以你做了很长的io。我会做

with open(originalpath) as f: 
    mat = f.read() 
while condition : 
    run += 1 
    write_mat_run(mat, run) 
    mat = func(mat) 

write_mat_run可以在另一个线程来完成。你应该检查异常。

BTW这可能会解决你的bug,或者至少说清楚。

+0

这是期望最大化算法的一部分,所以我需要上次运行的值用于当前运行。 – swot

+0

我解决了它(请参阅问题文章)如果系统允许我将它作为“真实”答案发布。但感谢您的帮助! – swot

+0

使用此模式,您可以使用当前运行的上一次运行。这可能更有效率,因为IO是一个瓶颈,可以杀死你的性能,减少bug,因为你不必依靠文件系统。即使你解决了你的bug,我建议你使用这种模式。 – MatthieuBizien

0

我可以看到你的代码没有错。下面具体的例子我的工作Linux机器上:

import os 

run = 0 
while run < 10: 
    run += 1 
    prevrun = run-1 

    if os.path.isfile("output%d.txt" %prevrun): 
     matfile = open("output%d.txt" %prevrun, "r") 
     data = matfile.readlines() 
     matfile.close() 
    else: 
     matfile = open("input.txt", "r") 
     data = matfile.readlines() 
     matfile.close() 

    data = [ s[:-1] + "!\n" for s in data ] 

    emissionmat_file = open("output%d.txt" %run, "w") 
    emissionmat_file.writelines(data) 
    emissionmat_file.close() 

它增加了一个感叹号文件input.txt中的每一行。

+1

正如你在问题中看到的,我解决了这个问题。只要系统允许我这样做,我就会把它放在一个“真正的”答案中。谢谢你的帮助。 – swot

0

我解决了它

关闭文件之前,我做

matfile.seek(0) 

这解决了我的问题。这个方法将读者的指针设置为开始。