Python 如何在控制台中打印最后一行和第二行到最后一行?

Python 如何在控制台中打印最后一行和第二行到最后一行?,python,python-3.x,Python,Python 3.x,使用Python3.4,在最后一行和倒数第二行之间是否有一种平台无关的打印方法?我试图完成的基本上是一个进度条,总是在最后一行。第二行及以上只是调试日志。例如: [DEBUG] Some info... [DEBUG] More info... Download Progress: [#### ] 40% (3 of 20) 我循环运行一些下载。循环的每一次迭代,我都会运行以下命令来打印进度条: def _print_progress_bar(self): amt_done

使用Python3.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
语句覆盖进度条)


我怎样才能做到这一点?

您可以通过使用回车符,
'\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

我能找到的最好方法是使用如下终端转义码:

for i in range(10):
    time.sleep(0.1)
    print('%s\n%s\r\033[F' % (i,i), end="")
这将在一行中打印一个数字,然后在另一行中打印,然后移动到行的开头,再向上移动一行以再次打印。这样,您可以自由编辑上方的线条


但是,此解决方案可能无法在Windows上工作。

您需要修改调试功能,以便在打印前擦除该行。这是我所知道的唯一一种平台不可知论的方式


Windows上特定于平台的方式是使用WinAPI滚动窗口的上半部分,并精确写入最后一行的上方。也许像这样的库可以帮助您。

我在Windows系统上尝试过,得到了这个结果(在handy
repr
表单中):
'0\n←[F1\n←[F2\n←[F3\n←[F4\n←[F5\n←[F6\n←[F7\n←[F8\n←[F9\n←[F'
。你能在你的Unix机器上试试我的答案吗?是的,你会在windows中看到这些漂亮的箭头。在Linux和大多数ANSI终端上,它会很好地工作。让你的windows终端模拟器理解ANSI代码是可能的。