使用Python 3.4,在最后一行和倒数第二行之间是否存在与平台无关的打印方法?我想要完成的基本上是最后一行的进度条。第二行及以上只是调试日志。例如:
[DEBUG] Some info...
[DEBUG] More info...
Download Progress: [#### ] 40% (3 of 20)
我在循环中运行一些下载。循环的每次迭代我运行它来打印进度条:
def _print_progress_bar(self):
amt_done = self._count / self._max
print('\rDownload Progress: [{:20s}] {:.1f}% ({})'.format(
'#' * int(amt_done * 20),
amt_done * 100,
self._padded_counter(' of ')), end='')
在调用此方法来呈现进度条之间,我想在其上面插入诊断消息(此后我不希望print
语句覆盖进度条,基本上)。
我该怎么做?
答案 0 :(得分:0)
您可以使用回车'\r'
来获得此效果。在Windows上,这是与换行符('\n'
)组合以创建新行的字符。在Unix系统上,裸换行自动返回托架,但'\r'
仍然是有效字符。例如,print('hi\rhello')
将打印'hi'
,返回到行的开头,然后打印'hello'
,因此只有'hello'
实际显示结束。您可以使用end=''
来压制print()
的新行。以下函数演示了如何操作 - 我建议运行它来查看自己会发生什么,因为输出当然是动态的。
>>> import time, sys
>>> def doit():
... print('part 1')
... print(0, end='')
... sys.stdout.flush()
... time.sleep(1)
... print('\rpart 2')
... print(1)
...
>>> doit()
part 1
part 2
1
答案 1 :(得分:0)
我能找到的最好的方法是使用这样的终端转义码:
for i in range(10):
time.sleep(0.1)
print('%s\n%s\r\033[F' % (i,i), end="")
这将在一行中打印一个数字,然后在另一行中打印,然后移动到行的开头,再一行打印再次打印。这样您就可以自由编辑上方的行。
但是,此解决方案可能无法在Windows上运行。
答案 2 :(得分:0)
您需要修改DEBUG功能以在打印前擦除线条。这是我所知道的唯一与平台无关的方式。
Windows上特定于平台的方法是使用WinAPI滚动窗口的上半部分并精确写入最后一行上方的行。也许像https://pypi.python.org/pypi/asciimatics/1.5.0.post1这样的图书馆可以帮助你。