至于将计算进度显示到标准输出,您可以使用进度条模块。
例子:
import time
import progressbar
maxval = 100
pbar = progressbar.ProgressBar(maxval=maxval)
pbar.start()
for i in range(maxval):
# do something
time.sleep(0.05)
pbar.update(i+1)
pbar.finish()
输出:
$ python test.py
52% |##################################### |
至于将输出写入文件,不需要关闭文件即可查看输出,而是刷新输出缓冲区。(事实上,在循环体中重复打开并可能截断文件会效率低下并且可能适得其反。)
查看文件对象的刷新和os 模块用于将文件内容刷新到磁盘的 fsync 方法。但是,这通常不是必需的。当您将足够的数据写入文件时,缓冲区将被刷新,因为您可以将其打印到终端。(这样您通常可以tail -f progess_file
毫无问题地输出。)
如果它正在记录您想要实现的目标,请查看logging 模块。您可以使用它来获得一个很好的可扩展日志系统。您可以选择是否在代码中的单个点将日志记录到文件或标准输出。您只需按名称“获取”主记录器,即可将其他模块的日志记录活动附加到同一日志:
logger = logging.getLogger("__main__")
(或者,您可以在那里使用不同的名称很好地设置另一个记录器。)
例子:
import time
import logging
# set up the logging
def setup_logger(logfilename = None):
logger = logging.getLogger(__name__) # probably __name__ == "__main__"
logger.setLevel(logging.DEBUG)
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
if logfilename:
# write to logfile
handler = logging.FileHandler(logfilename)
else:
# write to stdout
handler = logging.StreamHandler()
handler.setFormatter(formatter)
logger.addHandler(handler)
return logger
logger = setup_logger("test.log")
# example use of the logger
maxval = 100
for i in range(1,maxval+1):
# do something
time.sleep(0.05)
if (i)%(maxval/10) == 0:
logger.debug("progress:% 4d %% done", i)
输出:
2013-05-15 21:03:23,313 - DEBUG - progress: 10 % done
2013-05-15 21:03:23,822 - DEBUG - progress: 20 % done
2013-05-15 21:03:24,323 - DEBUG - progress: 30 % done
2013-05-15 21:03:24,825 - DEBUG - progress: 40 % done
2013-05-15 21:03:25,326 - DEBUG - progress: 50 % done
2013-05-15 21:03:25,827 - DEBUG - progress: 60 % done
2013-05-15 21:03:26,328 - DEBUG - progress: 70 % done
2013-05-15 21:03:26,829 - DEBUG - progress: 80 % done
2013-05-15 21:03:27,330 - DEBUG - progress: 90 % done
2013-05-15 21:03:27,831 - DEBUG - progress: 100 % done