PyCharm Python Console: la impresión en la misma línea no funciona como estaba previsto

Mi objective es mostrar un progreso de carga en mi consola sobrescribiendo la línea anterior con el progreso actual. He encontrado muchas soluciones para la versión 3 de Python, pero esas no funcionan.

Por ejemplo:

import time for i in range(10): print(i, end='', flush=True) time.sleep(1) 

Me da la siguiente salida:

 0123456789 

O ambos:

 import time for i in range(10): print(i, end='\r', flush=True) time.sleep(1) 

y:

 import time for i in range(10): print("\b" + str(i), end='', flush=True) time.sleep(1) 

Me da la siguiente salida:

 0 1 2 3 ... 

Alguna idea ? Estoy trabajando bajo PyCharm Community Edition con el paquete Anaconda.

¡Muchas gracias!

EDITAR: el problema no parece ocurrir cuando ejecuto un archivo python (usando PyCharm), pero solo cuando hago “Ejecutar selección en la consola”

Necesitas tener control sobre la escritura en stdout y enjuagarla. Así que el enlace dado por ma3oun es una respuesta valiosa. Desafortunadamente, la consola de PyCharm funciona de manera diferente a la línea de comandos. La pregunta sobre cómo funciona se debe dirigir al equipo de PyCharm y Maybie les pide que cambien este comportamiento.

De todos modos, la solución para su problema es agregarle antes de realizar la escritura:

 import sys import time for i in range(10): sys.stdout.write("\r{0}".format(str(i))) sys.stdout.flush() time.sleep(1) 

Sin embargo, para un tiempo de sueño más corto (por ejemplo, 0.1) hay un problema con el vaciado del búfer corto. Por cada descarga, se imprime más de un solo valor de escritura. Como solución encontré que puede agregar otro de esa manera:

 for i in range(10): sys.stdout.write("\r \r {0}".format(str(i))) sys.stdout.flush() time.sleep(0.1) 

Esto obligará a la consola a mostrar solo un valor de escritura, pero perderá algunos de los valores intermedios de la pantalla, ya que parece que el reajuste de actualización es más lento que 0,1 de segundo.

Mi solución para el banner de progreso que se muestra correctamente en la consola de PyCharm:

 import sys import time progressVis = {0: ' ', 1: '- ', 2: '-- ', 3: '--- ', 4: '---- ', 5: '----- ', 6: '------ ', 7: '------- ', 8: '-------- ', 9: '--------- ', 10: '----------'} size = 20 for i in range(0, size): percent = int((float(i + 1) / size) * 10) str1 = "\r \r [{0}] {1}/{2} {3}%".format(progressVis[percent], i + 1, size, ((i + 1) * 100 / size)) sys.stdout.write(str1) sys.stdout.flush() time.sleep(0.1)