我的目标是通过用当前进度覆盖上一行来在我的控制台中显示加载进度。我已经找到了很多适用于 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
...
有什么想法吗?我在 PyCharm Community Edition 下使用 Anaconda 包工作。
非常感谢!
编辑:当我运行 python 文件(使用 PyCharm)时,问题似乎没有发生,但只有当我执行“在控制台中执行选择”时才会发生
最佳答案
您需要控制写入标准输出并刷新它。所以 ma3oun 给出的链接是有值(value)的答案。不幸的是,PyCharm 控制台的工作方式与命令行不同。质疑它是如何工作的应直接向 PyCharm 团队提出,并可能要求他们改变这种行为。
无论如何,您的问题的解决方案是在执行写入之前添加 \r
:
import sys
import time
for i in range(10):
sys.stdout.write("\r{0}".format(str(i)))
sys.stdout.flush()
time.sleep(1)
然而,对于较短的 sleep 时间(例如 0.1),刷新短缓冲区会出现问题。对于每次刷新,您得到的不仅仅是一个写入值。作为一种解决方法,我发现您可以像这样添加另一个 \r
:
for i in range(10):
sys.stdout.write("\r \r {0}".format(str(i)))
sys.stdout.flush()
time.sleep(0.1)
这将强制控制台仅显示一个写入值,但您会在显示之间丢失一些值,因为看起来刷新率慢于 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)
关于python - PyCharm Python 控制台 - 在同一行上打印未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43515165/