问题:输出到同一行覆盖先前的输出?
我正在写一个FTP下载器。代码的一部分是这样的:
ftp.retrbinary("RETR " + file_name, 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...
但我希望它打印此行,下次重新打印/刷新它,因此它只会显示一次,我会看到下载进度。
如何做呢?
回答 0
这是Python 3.x的代码:
print(os.path.getsize(file_name)/1024+'KB / '+size+' KB downloaded!', end='\r')
该end=
关键字是什么做的工作在这里-在默认情况下,print()
在一个换行符(结束\n
)字符,但可以使用不同的字符串替换。在这种情况下,用回车符结束该行,而是将光标返回到当前行的开头。因此,无需sys
为此类简单用法导入模块。print()
实际上有许多关键字参数可以用来大大简化代码。
要在Python 2.6+上使用相同的代码,请将以下行放在文件顶部:
from __future__ import print_function
回答 1
如果您只想更改一行,请使用\r
。\r
表示回车。它的作用仅仅是将插入号放回当前行的开头。它不会删除任何内容。同样,\b
可用于向后退一个字符。(某些终端可能不支持所有这些功能)
import sys
def process(data):
size_str = os.path.getsize(file_name)/1024, 'KB / ', size, 'KB downloaded!'
sys.stdout.write('%s\r' % size_str)
sys.stdout.flush()
file.write(data)
回答 2
真正的基本例子:
import time
import curses
stdscr = curses.initscr()
stdscr.addstr(0, 0, "Hello")
stdscr.refresh()
time.sleep(1)
stdscr.addstr(0, 0, "World! (with curses)")
stdscr.refresh()
回答 3
这是我的小类,可以重印文本块。它会正确清除先前的文本,因此您可以用较短的新文本覆盖旧文本而不会造成混乱。
import re, sys
class Reprinter:
def __init__(self):
self.text = ''
def moveup(self, lines):
for _ in range(lines):
sys.stdout.write("\x1b[A")
def reprint(self, text):
# Clear previous text by overwritig non-spaces with spaces
self.moveup(self.text.count("\n"))
sys.stdout.write(re.sub(r"[^\s]", " ", self.text))
# Print new text
lines = min(self.text.count("\n"), text.count("\n"))
self.moveup(lines)
sys.stdout.write(text)
self.text = text
reprinter = Reprinter()
reprinter.reprint("Foobar\nBazbar")
reprinter.reprint("Foo\nbar")
回答 4
我发现对于python 2.7中的一个简单的print语句,只需将逗号放在your的末尾'\r'
。
print os.path.getsize(file_name)/1024, 'KB / ', size, 'KB downloaded!\r',
这比其他非python 3解决方案要短,但也更难以维护。
回答 5
您只需在字符串末尾添加“ \ r”,然后在打印功能末尾添加逗号。例如:
print(os.path.getsize(file_name)/1024+'KB / '+size+' KB downloaded!\r'),
回答 6
我正在使用spyder 3.3.1-Windows 7-python 3.6,尽管可能不需要刷新。基于此帖子-https: //github.com/spyder-ide/spyder/issues/3437
#works in spyder ipython console - \r at start of string , end=""
import time
import sys
for i in range(20):
time.sleep(0.5)
print(f"\rnumber{i}",end="")
sys.stdout.flush()
回答 7
要超越python中的前一行,您需要做的就是在打印函数中添加end =’\ r’,请测试以下示例:
import time
for j in range(1,5):
print('waiting : '+j, end='\r')
time.sleep(1)
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。