如何在控制台中的最后一行和倒数第二行之间打印?

时间:2015-05-21 01:33:04

标签: python python-3.x

使用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语句覆盖进度条,基本上)。

我该怎么做?

3 个答案:

答案 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这样的图书馆可以帮助你。