我的目标是通过使用当前进度覆盖上一行来在我的控制台中显示加载进度。我已经为Python的第3版找到了很多解决方案,但这些解决方案都没有用。
例如:
import time
for i in range(10):
print(i, end='', flush=True)
time.sleep(1)
给我以下输出:
0123456789
或两者:
import time
for i in range(10):
print(i, end='\r', flush=True)
time.sleep(1)
和:
import time
for i in range(10):
print("\b" + str(i), end='', flush=True)
time.sleep(1)
给我以下输出:
0
1
2
3
...
有什么想法吗?我正在使用Anaconda软件包在PyCharm Community Edition下工作。
非常感谢!
编辑:当我运行python文件(使用PyCharm)时,问题似乎没有发生,但只有当我执行“在控制台中执行选择”时才会出现答案 0 :(得分:9)
你需要控制写入stdout并刷新它。所以ma3oun给出的链接是有价值的回答。不幸的是,PyCharm控制台的工作方式与命令行不同。询问它是如何工作的,应该直接向PyCharm团队提出,并且可以让他们改变这种行为。
无论如何,您的问题的解决方案是在执行write之前添加\ r \ n:
import sys
import time
for i in range(10):
sys.stdout.write("\r{0}".format(str(i)))
sys.stdout.flush()
time.sleep(1)
然而,对于较短的睡眠时间(例如0.1),冲洗短缓冲区存在问题。对于每次刷新,您只能获得一个打印的写入值。作为一种解决方法,我发现你可以添加另一个\ r:
for i in range(10):
sys.stdout.write("\r \r {0}".format(str(i)))
sys.stdout.flush()
time.sleep(0.1)
这会强制控制台只显示一个写入值,但是你会在显示之间丢失一些值,因为它看起来像刷新reate慢于0,1秒。
我在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)