在同一行输出并覆盖先前的输出?

165

我正在编写一个FTP下载器。其中一部分代码类似于这样:

ftp.retrbinary("RETR " + file_name, process)

我正在调用process函数来处理回调:

def process(data):
    print os.path.getsize(file_name)/1024, 'KB / ', size, 'KB downloaded!'
    file.write(data)

输出结果大致如下:

1784  KB / KB 1829 downloaded!
1788  KB / KB 1829 downloaded!
etc...   

但我希望它打印这行文字,下次重新打印/刷新时,只显示一次,并且我可以看到下载的进度。

如何做到这一点?


1
可能是控制台中的文本进度条的重复问题。 - Alexey
这与“控制台中的文本进度条”绝不是重复的。 这是一个类似的问题,但并不相同。 洗狗和洗猫很相似,它们都是哺乳动物。洗猫总是需要大量的锁子甲,而洗狗通常有8种不同的情况之一。 - Malcolm Anderson
1
尽管所有答案都会打印在同一行上,但如果后续行较短,则它们可能并不真正覆盖一行。为了确保这一点,应对所有要打印的变量使用字段宽度说明符。例如,如果使用f-strings,则可以使用以下代码:print(f'\r{filename:<30s} {progress<6d} downloaded', end='', flush=True) - farhanhubble
这个回答解决了你的问题吗?[动态地在一行中打印(https://dev59.com/I3A75IYBdhLWcg3wg5fs)] - mkrieger1
13个回答

0

Python 2.7:

print os.path.getsize(file_name)/1024, 'KB / ', size, 'KB downloaded!\r',
sys.stdout.flush()

如果您经常进行打印,则需要刷新。


0

我找到的最简单的方法是保持在同一行,并使用ANSI代码清除整个打印输出(这样可以避免新字符串比之前的字符串小时发生重叠)

def clear_line():
    LINE_CLEAR = '\x1b[2K'
    print(LINE_CLEAR, end= '\r')

例子:

print('Hello World', end = '\r')
clear_line()
print('Earth', end = '\r')

输出:

Earth

-2

这是我的答案。我也搜索过这个问题。我得到了很多解决方案,但这个对我有效。

 from time import sleep
 for _ in range(5):
     sleep(1)
     print(f'\rWritting on same line with chaning number {_}.',end='')
 else:
     print()
  • 是的,您可以在for块中使用else:语句。这将在for循环完成时添加新行。
  • 这仅适用于循环。它不会影响其他print()语句。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接