Python 输出到同一行覆盖以前的输出?
我正在写一个FTP下载程序。代码的一部分如下所示:Python 输出到同一行覆盖以前的输出?,python,refresh,progress-bar,Python,Refresh,Progress Bar,我正在写一个FTP下载程序。代码的一部分如下所示: ftp.retrbinary("RETR " + file_name, process) 1784 KB / KB 1829 downloaded! 1788 KB / KB 1829 downloaded! etc... 我正在调用函数进程来处理回调: def process(data): print os.path.getsize(file_name)/1024, 'KB / ', size, 'KB download
ftp.retrbinary("RETR " + file_name, process)
1784 KB / KB 1829 downloaded!
1788 KB / KB 1829 downloaded!
etc...
我正在调用函数进程来处理回调:
def process(data):
print os.path.getsize(file_name)/1024, 'KB / ', size, 'KB downloaded!'
file.write(data)
输出是这样的:
ftp.retrbinary("RETR " + file_name, process)
1784 KB / KB 1829 downloaded!
1788 KB / KB 1829 downloaded!
etc...
但我希望它打印这一行,下次重新打印/刷新它,这样它将只显示一次,我将看到下载的进度
如何做到这一点?请查看和
最基本的例子:
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()
请看一下和
最基本的例子:
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()
如果您只想更改一行,请使用
\r
<代码>\r表示回车。它的作用仅仅是将插入符号放回当前行的开头。它不会擦除任何东西。类似地,\b
可用于向后移动一个字符。(某些终端可能不支持所有这些功能)
如果您只想更改一行,请使用
\r
<代码>\r表示回车。它的作用仅仅是将插入符号放回当前行的开头。它不会擦除任何东西。类似地,\b
可用于向后移动一个字符。(某些终端可能不支持所有这些功能)
下面是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
下面是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
这是我的小班,可以重印文本块。它会正确地清除以前的文本,以便您可以用较短的新文本覆盖旧文本,而不会造成混乱
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")
这是我的小班,可以重印文本块。它会正确地清除以前的文本,以便您可以用较短的新文本覆盖旧文本,而不会造成混乱
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")
我发现在Python2.7中,对于一个简单的print语句,只需在
'\r'
后面加一个逗号即可
print os.path.getsize(file_name)/1024, 'KB / ', size, 'KB downloaded!\r',
这比其他非python 3解决方案短,但也更难维护。我发现,对于python 2.7中的一条简单打印语句,只需在
'\r'
后面加一个逗号即可
print os.path.getsize(file_name)/1024, 'KB / ', size, 'KB downloaded!\r',
这比其他非python 3解决方案短,但也更难维护。您只需在字符串末尾添加“\r”,并在打印函数末尾添加逗号即可。例如:
print(os.path.getsize(file_name)/1024+'KB / '+size+' KB downloaded!\r'),
您只需在字符串末尾添加'\r',并在打印函数末尾添加逗号即可。例如:
print(os.path.getsize(file_name)/1024+'KB / '+size+' KB downloaded!\r'),
我使用的是Spyder3.3.1-Windows7-Python3.6 尽管可能不需要冲洗。 根据这篇文章-
我使用的是Spyder3.3.1-Windows7-Python3.6 尽管可能不需要冲洗。 根据这篇文章-
要在python中覆盖上一行,只需将end='\r'添加到print函数中,测试以下示例:
import time
for j in range(1,5):
print('waiting : '+j, end='\r')
time.sleep(1)
要在python中覆盖上一行,只需将end='\r'添加到print函数中,测试以下示例:
import time
for j in range(1,5):
print('waiting : '+j, end='\r')
time.sleep(1)
我想补充一点,
\r
表示回车。它的作用仅仅是将插入符号放回当前行的开头。它不会擦除任何东西。类似地,\b
可用于向后移动一个字符。(有些终端可能不支持所有这些功能)sys.stdout.write('%s\r',size\u str')
我想你的意思是sys.stdout.write('%s\r'%size\u str)
,但它不起作用。@Adrien:酷,添加了这个@克里斯蒂安:谢谢,更新了,已经很晚了。还要注意,你仍然可以使用print
而不是sys.stdout.write
,如果你愿意的话:print size\u str+“\r”,
可以正常工作。print语句末尾的,
会抑制换行符sys.stdout.flush()
仍然需要我添加\r
表示回车。它的作用仅仅是将插入符号放回当前行的开头。它不会擦除任何东西。类似地,\b
可用于向后移动一个字符。(有些终端可能不支持所有这些功能)sys.stdout.write('%s\r',size\u str')
我想你的意思是sys.stdout.write('%s\r'%size\u str)
,但它不起作用。@Adrien:酷,添加了这个@克里斯蒂安:谢谢,更新了,已经很晚了。还要注意,你仍然可以使用print
而不是sys.stdout.write
,如果你愿意的话:print size\u str+“\r”,
可以正常工作。print语句末尾的,
会抑制换行符sys.stdout.flush()
仍然是必需的,curses仅在Unix上可用。OP没有告诉我们他的应用程序针对的是哪个操作系统……我太习惯在Linux下工作了,以至于我甚至没有注意到模块文档中关于模块仅适用于UNIX的警告。。谢谢你指出这一点,@Adrien@AdrienPlisson,我知道这个问题是几年前提出来的,但是,你实际上可以在Windows上看到诅咒:当我把它粘贴到Python解释器中时,我的终端变成了fubar。退出