使用Python中的While循环打印到同一行

时间:2016-03-21 12:30:27

标签: python

我试图从while循环中获取以下输出以显示进度。

  - ########

以下是代码,

print '  - #',
x = 1
while x < 15:
    print '#',
    time.sleep(0.5)
    x += 1

但是我只是在while循环完成后打印所有哈希值(?)

任何想法

5 个答案:

答案 0 :(得分:4)

import sys
import time
while True:
    sys.stdout.write('#')
    sys.stdout.flush()
    time.sleep(0.5)

答案 1 :(得分:4)

有很多方法可以解决这个问题。

  1. 如果您使用的是Python 2.X,则需要在每次打印后调用sys.stdout.flush()

  2. 如果您正在使用python 3,那么您可以通过执行

    来完成它

    print(#,sep = ' ', flush=True)

  3. 如果使用-u选项运行python,则可以完全禁用缓冲:python -u script.py

    如果您直接运行脚本,./script.py,请在shebang行中指定:#!/usr/bin/env python -u

  4. 另一种方法是从bash shell中设置env变量PYTHONUNBUFFEREDexport PYTHONUNBUFFERED="aa"

  5. 添加更多详细信息以解决问题:

    Python中的Stdout是行缓冲的。这意味着如果您在打印中跳过“,”,则输出将按预期打印。但是当输出打印在同一行时,只有在有新行或缓冲区已满时才会刷新。如果将输出重定向到文件而不是终端(python script.py >output),则只有在缓冲区已满时才会刷新输出。如果将输出传递给cat,则可以验证这一点: python script.py | cat

    在本答案和其他答案中提到的所有方法中,我们明确地告诉Python不要缓冲,但是一旦得到它就刷新输出。

    关于该主题的更多研究:

    此行为不是Python特定的。 C中也是printf的情况。这是由于glibc实现了linux。这种行为背后的原因是效率。因为输出是缓冲的,所以读取和写入操作的数量被最小化。我发现这篇文章给出了相同的简要描述:Unix Buffering Delays

答案 2 :(得分:2)

默认情况下,

print会写入存储在sys.stdout中的stdout。打印新行时刷新标准输出。由于您不打印新行,因此在您执行之前不会显示文本。但是,您可以自己刷新stdout:

import sys
import time
print '  - #',
sys.stdout.flush()
x = 1
while x < 15:
    print '#',
    sys.stdout.flush()
    time.sleep(0.5)
    x += 1

你真的不需要while循环。 for循环会更短:

import sys
import time
print '  - #',
sys.stdout.flush()
x = 1
for _ in range(15):
    print '#',
    sys.stdout.flush()
    time.sleep(0.5)

答案 3 :(得分:1)

我想您已经得到了答案但是如果您以后想要覆盖同一行,请在您打印的字符前添加回车\r(将打字机的托架返回到当前的开头)线,当然;))。我使用它来让我的文件处理脚本写入同一行 - 每个新行都覆盖最后一行。如果新行比前一行短,则需要摆弄额外的空白区域。

EG。制作一个旋转的装载机,它最终会被越来越多的# s:

所取代
import sys
import time

# rotating loader "animation"
# Ubuntu or the aptitude package manager uses something similar
x = 1
symbols = ["|", "/", "-", "\\"]
while x < 20:
    x+=1
    sys.stdout.write("\r" + symbols[x%len(symbols)])
    sys.stdout.flush()
    time.sleep(0.2)


# progress bar "animation" using hashtags 
x = 1
sys.stdout.write("\r")
while x < 10:
    x+=1
    sys.stdout.write('#')
    sys.stdout.flush()
    time.sleep(0.2)

print("")

答案 4 :(得分:0)

看看tqdm。它非常容易为您显示一个好看的进度条。

from tqdm import tqdm
for i in tqdm(range(9)):
    ...