186

我是 python 新手,正在编写一些脚本来自动从 FTP 服务器等下载文件。我想显示下载的进度,但我希望它保持在相同的位置,例如:

输出:

下载文件 FooFile.txt [47%]

我试图避免这样的事情:

     Downloading File FooFile.txt [47%]
     Downloading File FooFile.txt [48%]
     Downloading File FooFile.txt [49%]

我该怎么做呢?


重复如何在命令行应用程序中打印当前行?

4

9 回答 9

276

您还可以使用回车符:

sys.stdout.write("Download progress: %d%%   \r" % (progress) )
sys.stdout.flush()
于 2009-02-05T18:22:47.683 回答
54

蟒蛇2

我喜欢以下内容:

print 'Downloading File FooFile.txt [%d%%]\r'%i,

演示:

import time

for i in range(100):
    time.sleep(0.1)
    print 'Downloading File FooFile.txt [%d%%]\r'%i,

蟒蛇 3

print('Downloading File FooFile.txt [%d%%]\r'%i, end="")

演示:

import time

for i in range(100):
    time.sleep(0.1)
    print('Downloading File FooFile.txt [%d%%]\r'%i, end="")

带有 Python 3 的 PyCharm 调试器控制台

# On PyCharm Debugger console, \r needs to come before the text.
# Otherwise, the text may not appear at all, or appear inconsistently.
# tested on PyCharm 2019.3, Python 3.6

import time

print('Start.')
for i in range(100):
    time.sleep(0.02)
    print('\rDownloading File FooFile.txt [%d%%]'%i, end="")
print('\nDone.')
于 2009-02-05T19:29:23.197 回答
28

使用像curses 模块这样的终端处理库:

curses 模块提供了curses 库的接口,curses 库是便携式高级终端处理的事实标准。

于 2009-02-05T18:19:09.313 回答
16

\b多次打印退格字符,然后用新号码覆盖旧号码。

于 2009-02-05T18:14:06.297 回答
13

对于 Python 3xx:

import time
for i in range(10):
    time.sleep(0.2) 
    print ("\r Loading... {}".format(i)+str(i), end="")
于 2017-08-24T23:28:23.337 回答
8
#kinda like the one above but better :P

from __future__ import print_function
from time import sleep

for i in range(101):
  str1="Downloading File FooFile.txt [{}%]".format(i)
  back="\b"*len(str1)
  print(str1, end="")
  sleep(0.1)
  print(back, end="")
于 2011-11-02T04:14:27.630 回答
4

一个对我有用的巧妙解决方案是:

from __future__ import print_function
import sys
for i in range(10**6):
    perc = float(i) / 10**6 * 100
    print(">>> Download is {}% complete      ".format(perc), end='\r')
    sys.stdout.flush()
print("")

sys.stdout.flush很重要,否则它会变得非常笨重,并且print("")for 循环退出也很重要。

更新:正如评论中提到的,print也有一个flush论点。因此,以下内容也将起作用:

from __future__ import print_function
for i in range(10**6):
    perc = float(i) / 10**6 * 100
    print(">>> Download is {}% complete      ".format(perc), end='\r', flush=True)
print("")
于 2017-05-10T06:32:56.117 回答
0
x="A Sting {}"
   for i in range(0,1000000):
y=list(x.format(i))
print(x.format(i),end="")

for j in range(0,len(y)):
    print("\b",end="")
于 2018-03-03T17:21:14.523 回答
0

在 python 3 中,函数print可以获取许多参数。函数 print 的完整签名是: print(args*, sep=' ', end='\n', file=sys.stdout, flush=False)

whensep是参数的分隔符args*end是如何结束打印行('\n\ 表示新行)文件是打印输出的位置(stdout 是领事),flush 是是否清理缓冲区。

使用示例

import sys

a = 'A'
b = 0
c = [1, 2, 3]

print(a, b, c, 4, sep=' * ', end='\n' + ('-' * 21), file=sys.stdout, flush=True)

输出

A * 0 * [1, 2, 3] * 4
---------------------

在 python 中,有很多方法可以格式化字符串,甚至是内置的格式化字符串类型。

如何格式化字符串

  1. format()功能。(一些例子
  2. 格式化字符串文字或通用名称f-strings
  3. 使用 % 格式化(更多关于这个

例子

name = 'my_name'

>>> print('my name is: {}'.format(name))
my name is: my_name

# or
>>> print('my name is: {user_name}'.format(user_name=name))
my name is: my_name

# or
>>> print('my name is: {0}'.format(name))
my name is: my_name

# or using f-strings
>>> print(f'my name is: {name}')
my name is: my_name

# or formatting with %
>>> print('my name is: %s' % name)
my name is: my_name
于 2021-05-02T09:59:33.610 回答