Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 输出到同一行覆盖以前的输出?_Python_Refresh_Progress Bar - Fatal编程技术网

Python 输出到同一行覆盖以前的输出?

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下载程序。代码的一部分如下所示:

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。退出