English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Il problema principale della barra di avanzamento è che tutti i caratteri si trovano sulla stessa riga e possono essere modificati.
Tuttavia, quando si esegue la frase print, Python aggiunge automaticamente '\n' alla fine della stampa, ovvero un cambiamento di riga, il che rende impossibile modificare l'output una volta stampato sulla console. Pertanto, non possiamo più completare l'output utilizzando print.
Stiamo utilizzando la funzione sys.stdout.write() della libreria sys, questa funzione esegue l'output di questa stringa sulla console senza aggiungere alcun fine, il che significa che l'output non è ancora completamente terminato. Tramite la funzione sys.stdout.flush() possiamo stampare temporaneamente l'output sulla console (creando l'effetto di print, chiamiamolo temporaneamente output fittizio). Allora, se utilizziamo il carattere di escape 'r' (torno all'inizio della riga), tutto sembra molto più ragionevole, no?
也就是说:打印字符串的时候,没有加上'\n',同时让光标回到行首,再把当前缓冲区显示出来,也就好象是print了一样,但是这时候光标还在原来的位置。
一个例子
[经测试,在Linux终端中执行才有效果,pycharm中调试输出没有效果]
import sys, time for i in range(5): sys.stdout.write('HELLO: %05d' % i) sys.stdout.flush() time.sleep(1)
在终端下执行这段代码就会得到简单的进度条效果。
接下来还需要解决两个问题:
一:清空缓冲区
有些聪明的读者可能发现,当新的字符串比之前短的时候会出现问题,比如下面这段代码:
import sys, time for i in range(5): sys.stdout.write(str(i) * (5 - i) + '\r') sys.stdout.flush() time.sleep(1)
运行后发现结果跟我们希望的不太一样。
其实是因为已经被flush出去的字符并不会主动清空,所以只有新写入的被修改了。针对这点我目前的解决方案是先输出一波空格把之前的字符串冲掉然后重新写:
import sys, time for i in range(5): sys.stdout.write(' ' * 10 + '\r') sys.stdout.flush() sys.stdout.write(str(i) * (5 - i) + '\r') sys.stdout.flush() time.sleep(1)
二:固定底边输出
有时候我们希望在进度条加载的同时还有一些其他的输出。
我们不妨在刷新掉上一次输出之后输出所需输出的字符串,然后在假输出进度条。
采用如下代码:
import sys, time for i in range(5): sys.stdout.write(' ' * 10 + '\r') sys.stdout.flush() print i sys.stdout.write(str(i) * (5 - i) + '\r') sys.stdout.flush() time.sleep(1)
就可以完成所需任务了。
怎么样,其实原理还是挺简单的吧?
这里给出一个自己实现的类用来打印进度条:
import sys, time class ProgressBar: def __init__(self, count = 0, total = 0, width = 50): self.count = count self.total = total self.width = width def move(self): self.count += 1 def log(self, s): sys.stdout.write(' ' * (self.width + 9) + '\r') sys.stdout.flush() print s progress = self.width * self.count / self.total sys.stdout.write('{0:3}/{1:3}: '.format(self.count, self.total)) sys.stdout.write('#' * progress + '-' * (self.width - progress) + '\r') if progress == self.width: sys.stdout.write('\n') sys.stdout.flush() bar = ProgressBar(total = 10) for i in range(10): bar.move() bar.log('We have arrived at: ' + str(i + 1)) time.sleep(1)
L'effetto è il seguente:
In questo modo, è possibile visualizzare agevolmente il progresso dell'esecuzione dei programmi in alcune attività, come i爬虫, l'apprendimento automatico e altri lavori che non si sa quanto tempo richiedono, avranno una stima del tempo visiva.
Ecco tutto il codice di implementazione della funzione di barra di progresso nel console Python che ho condiviso con voi, spero che possa essere utile come riferimento, e spero che possiate sostenere fortemente il tutorial urlaio.
Dichiarazione: il contenuto di questo articolo è stato tratto da Internet, è di proprietà del rispettivo autore, il contenuto è stato contribuito e caricato autonomamente dagli utenti di Internet, questo sito non detiene i diritti di proprietà, non è stato editato manualmente e non assume alcuna responsabilità legale correlata. Se trovi contenuti sospetti di violazione del copyright, ti preghiamo di inviare una email a: notice#oldtoolbag.com (al momento dell'invio dell'email, sostituisci # con @) per segnalare il problema e fornire prove pertinenti. Una volta verificata, questo sito rimuoverà immediatamente il contenuto sospetto di violazione del copyright.