Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.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 - Fatal编程技术网

Python打印出状态栏和百分比

Python打印出状态栏和百分比,python,Python,要实现如下所示的状态栏: [========== ] 45% [================ ] 60% [==========================] 100% 我希望这是打印出来的标准输出,并不断刷新它,而不是打印到另一行。如何执行此操作?您可以使用\r()。演示: '\r'字符(回车符)将光标重置到行的开头,并允许您写入行上以前的内容 from time import sleep import sys for i in

要实现如下所示的状态栏:

[==========                ]  45%
[================          ]  60%
[==========================] 100%

我希望这是打印出来的标准输出,并不断刷新它,而不是打印到另一行。如何执行此操作?

您可以使用
\r
()。演示:


'\r'
字符(回车符)将光标重置到行的开头,并允许您写入行上以前的内容

from time import sleep
import sys

for i in range(21):
    sys.stdout.write('\r')
    # the exact output you're looking for:
    sys.stdout.write("[%-20s] %d%%" % ('='*i, 5*i))
    sys.stdout.flush()
    sleep(0.25)

我不能100%确定这是否可以在所有系统上完全移植,但至少它可以在Linux和OSX上工作。

有一个Python模块可以从中调用,它实现了这样的功能。如果您不介意添加依赖项,这是一个很好的解决方案。否则,请使用其他答案之一

如何使用它的一个简单示例:

import progressbar
from time import sleep
bar = progressbar.ProgressBar(maxval=20, \
    widgets=[progressbar.Bar('=', '[', ']'), ' ', progressbar.Percentage()])
bar.start()
for i in xrange(20):
    bar.update(i+1)
    sleep(0.1)
bar.finish()

要安装它,您可以使用
easy\u install progressbar
,或者
pip install progressbar
(如果您喜欢pip)。

这里您可以使用以下代码作为功能:

def drawProgressBar(percent, barLen = 20):
    sys.stdout.write("\r")
    progress = ""
    for i in range(barLen):
        if i < int(barLen * percent):
            progress += "="
        else:
            progress += " "
    sys.stdout.write("[ %s ] %.2f%%" % (progress, percent * 100))
    sys.stdout.flush()
def drawProgressBar(百分比,巴伦=20):
sys.stdout.write(“\r”)
progress=“”
对于范围内的i(巴伦):
如果i
使用.format时:

def drawProgressBar(percent, barLen = 20):
    # percent float from 0 to 1. 
    sys.stdout.write("\r")
    sys.stdout.write("[{:<{}}] {:.0f}%".format("=" * int(barLen * percent), barLen, percent * 100))
    sys.stdout.flush()
def drawProgressBar(百分比,巴伦=20):
#百分比浮动从0到1。
sys.stdout.write(“\r”)

sys.stdout.write(“[{:基于上面的答案和关于CLI进度条的其他类似问题,我想我得到了所有这些问题的通用答案。请访问

以下是该函数的副本,但已根据您的风格进行了修改:

import time, sys

# update_progress() : Displays or updates a console progress bar
## Accepts a float between 0 and 1. Any int will be converted to a float.
## A value under 0 represents a 'halt'.
## A value at 1 or bigger represents 100%
def update_progress(progress):
    barLength = 20 # Modify this to change the length of the progress bar
    status = ""
    if isinstance(progress, int):
        progress = float(progress)
    if not isinstance(progress, float):
        progress = 0
        status = "error: progress var must be float\r\n"
    if progress < 0:
        progress = 0
        status = "Halt...\r\n"
    if progress >= 1:
        progress = 1
        status = "Done...\r\n"
    block = int(round(barLength*progress))
    text = "\rPercent: [{0}] {1}% {2}".format( "="*block + " "*(barLength-block), progress*100, status)
    sys.stdout.write(text)
    sys.stdout.flush()
导入时间,系统 #update_progress():显示或更新控制台进度条 ##接受介于0和1之间的浮点。任何int都将转换为浮点。 ##0以下的值表示“暂停”。 ##大于等于1的值表示100% def更新_进度(进度): barLength=20#修改此选项以更改进度条的长度 status=“” 如果isinstance(进度,整数): 进度=浮动(进度) 如果不存在(进度、浮动): 进度=0 status=“error:进度变量必须是float\r\n” 如果进度<0: 进度=0 status=“暂停…\r\n” 如果进度>=1: 进度=1 status=“完成…\r\n” block=int(圆形(条形长度*进度)) text=“\r百分比:[{0}]{1}%{2}”。格式(“=”*块+”*(条形长度块),进度*100,状态) sys.stdout.write(文本) sys.stdout.flush()
看起来像


百分比:[=====================]99.0%

我找到了有用的库TQM(,以前:)。它会自动估计完成时间,并可用作迭代器

用法:

import tqdm
import time

for i in tqdm.tqdm(range(1000)):
    time.sleep(0.01)
    # or other long operations
结果:

|####------| 450/1000  45% [elapsed: 00:04 left: 00:05, 99.15 iters/sec]

tqdm
可以包装任何iterable。

基于这里和其他地方的一些答案,我编写了这个简单的函数,它显示进度条和经过/估计的剩余时间。应该适用于大多数基于unix的机器

import time
import sys

percent = 50.0
start = time.time()
draw_progress_bar(percent, start)


def draw_progress_bar(percent, start, barLen=20):
sys.stdout.write("\r")
progress = ""
for i in range(barLen):
    if i < int(barLen * percent):
        progress += "="
    else:
        progress += " "

elapsedTime = time.time() - start;
estimatedRemaining = int(elapsedTime * (1.0/percent) - elapsedTime)

if (percent == 1.0):
    sys.stdout.write("[ %s ] %.1f%% Elapsed: %im %02is ETA: Done!\n" % 
        (progress, percent * 100, int(elapsedTime)/60, int(elapsedTime)%60))
    sys.stdout.flush()
    return
else:
    sys.stdout.write("[ %s ] %.1f%% Elapsed: %im %02is ETA: %im%02is " % 
        (progress, percent * 100, int(elapsedTime)/60, int(elapsedTime)%60,
         estimatedRemaining/60, estimatedRemaining%60))
    sys.stdout.flush()
    return
导入时间
导入系统
百分比=50.0
开始=时间。时间()
绘制进度条(百分比,开始)
def绘图进度条(百分比、开始、巴伦=20):
sys.stdout.write(“\r”)
progress=“”
对于范围内的i(巴伦):
如果i
今天,在马克·拉沙科夫(Mark Rushakoff)尝试了这个解决方案之后,我遇到了这个问题

from time import sleep
import sys

for i in range(21):
sys.stdout.write('\r')
# the exact output you're looking for:
sys.stdout.write("[%-20s] %d%%" % ('='*i, 5*i))
sys.stdout.flush()
sleep(0.25)

我可以说,这在使用python 3.4.3 64位的W7-64上运行良好,但仅在本机控制台中运行。然而,当使用spyder 3.0.0dev的内置控制台时,换行符仍然/再次出现。由于我花了一些时间才弄清楚,我想在这里报告这一观察结果。

这是一种非常简单的方法,可以用于任何循环

#!/usr/bin/python
for i in range(100001):
    s =  ((i/5000)*'#')+str(i)+(' %')
    print ('\r'+s),

如果您正在开发命令行界面,我建议您查看一下
单击
,这非常好:

import click
import time

for filename in range(3):
    with click.progressbar(range(100), fill_char='=', empty_char=' ') as bar:
        for user in bar:
            time.sleep(0.01)
这里是您得到的输出:

$ python test.py
  [====================================]  100%
  [====================================]  100%
  [=========                           ]   27%

PyProg是Python的开源库,用于创建超级可定制的进度指示器和进度条

它目前的版本是1.0.2;它托管在Github上,可在PyPI上使用(下面的链接)。它与Python3&2兼容,也可以与Qt控制台一起使用

它非常易于使用。以下代码:

import pyprog
from time import sleep

# Create Object
prog = pyprog.ProgressBar(" ", " ", total=34, bar_length=26, complete_symbol="=", not_complete_symbol=" ", wrap_bar_prefix=" [", wrap_bar_suffix="] ", progress_explain="", progress_loc=pyprog.ProgressBar.PROGRESS_LOC_END)
# Update Progress Bar
prog.update()

for i in range(34):
    # Do something
    sleep(0.1)
    # Set current status
    prog.set_stat(i + 1)
    # Update Progress Bar again
    prog.update()

# Make the Progress Bar final
prog.end()
将产生您想要的结果(甚至是条长!):

有关自定义进度条的更多选项,请转到此网站的Github页面

我实际上制作了PyProg,因为我需要一个简单但超级可定制的进度条库。您可以使用:
pip install PyProg
轻松安装它

PyProg Github:
PyPI:

最简单的还是

import sys
total_records = 1000
for i in range (total_records):
    sys.stdout.write('\rUpdated record: ' + str(i) + ' of ' + str(total_records))
    sys.stdout.flush()

关键是将整数类型转换为字符串。

使用@Mark Rushakoff answer,我找到了一种更简单的方法,无需调用sys库。它与Python 3一起工作。在Windows中测试:

from time import sleep
for i in range(21):
    # the exact output you're looking for:
    print ("\r[%-20s] %d%%" % ('='*i, 5*i), end='')
    sleep(0.25)
如中所述,您可以输出回车字符sys.stdout.write('\r')
,以将光标重置到行首。要概括该解决方案,同时实现,您可以使用

从时间导入睡眠
导入系统
n_bar=50
iterable=范围(33)#用于演示
n_iter=len(iterable)
对于i,枚举中的项(iterable):
j=(i+1)/n_iter
sys.stdout.write('\r')
sys.stdout.write(f“[{'='*int(n_-bar*j):{n_-bar}s}]{int(100*j)}%”)
sys.stdout.flush()
import sys
total_records = 1000
for i in range (total_records):
    sys.stdout.write('\rUpdated record: ' + str(i) + ' of ' + str(total_records))
    sys.stdout.flush()
from time import sleep
for i in range(21):
    # the exact output you're looking for:
    print ("\r[%-20s] %d%%" % ('='*i, 5*i), end='')
    sleep(0.25)
import sys

def printProgressBar(i,max,postText):
    n_bar =10 #size of progress bar
    j= i/max
    sys.stdout.write('\r')
    sys.stdout.write(f"[{'=' * int(n_bar * j):{n_bar}s}] {int(100 * j)}%  {postText}")
    sys.stdout.flush()
total=33
for i in range(total):
    printProgressBar(i,total,"blah")
    sleep(0.05)  
[================================================  ] 96%  blah  
from time import sleep
import os
import sys
from math import ceil

l = list(map(int,os.popen('stty size','r').read().split()))
col = l[1]
col = col - 6

for i in range(col):
    sys.stdout.write('\r')
    getStr = "[%s " % ('='*i)
    sys.stdout.write(getStr.ljust(col)+"]"+"%d%%" % (ceil((100/col)*i)))
    sys.stdout.flush()
    sleep(0.25)
print("")
def printProgressBar(value,label):
    n_bar = 40 #size of progress bar
    max = 100
    j= value/max
    sys.stdout.write('\r')
    bar = '█' * int(n_bar * j)
    bar = bar + '-' * int(n_bar * (1-j))

    sys.stdout.write(f"{label.ljust(10)} | [{bar:{n_bar}s}] {int(100 * j)}% ")
    sys.stdout.flush()
printProgressBar(30,"IP")
j = (i + 1) / n
stdout.write('\r')
stdout.write('[%-20s] %d%%' % ('='*int(20*j), 100*j))
stdout.flush()
from time import sleep

for i in range(21):
    spaces = " " * (20 - i)
    percentage = 5*i
    print(f"\r[{'='*i}{spaces}]{percentage}%", flush=True, end="")
    sleep(0.25)
import progressbar
import time

# Function to create  
def animated_marker():
    widgets = ['Loading: ', progressbar.Bar('=', '[', ']', '-'), progressbar.Percentage()]
    bar = progressbar.ProgressBar(max_value=200,widgets=widgets).start() 
      
    for i in range(200): 
        time.sleep(0.1)
        bar.update(i+1)
    bar.finish()

# Driver's code 
animated_marker()