dynamic地在一行中打印

我想做几个语句,在没有在语句之间看到换行符的情况下给出标准输出。

具体来说,假设我有:

for item in range(1,100): print item 

结果是:

 1 2 3 4 . . . 

如何让这个看起来像:

 1 2 3 4 5 ... 

更好的是,是否可以在最后一个号码上打印单个号码,因此一次只能在屏幕上显示一个号码?

print item更改为:

  • print item,在Python 2.7
  • 在Python 3中print(item, end=" ")

如果要dynamic地打印数据,请使用以下语法:

  • 在Python 3中print(item, sep=' ', end='', flush=True)

顺便说一句……如何每次刷新它,所以在一个地方打印mi只是改变数字。

一般来说,要做到这一点的方法是使用terminal控制代码 。 这是一个特别简单的例子,你只需要一个特殊的字符:U + 000D CARRIAGE RETURN,在Python(和许多其他语言)中写成'\r' 。 以下是基于您的代码的完整示例:

 from sys import stdout from time import sleep for i in range(1,20): stdout.write("\r%d" % i) stdout.flush() sleep(1) stdout.write("\n") # move the cursor to the next line 

有些事情可能令人惊讶:

  • \r在string的开头,以便在程序运行时,光标总是在数字之后。 这不仅仅是表面的:如果你反其道而行之,一些terminal仿真器会变得非常混乱。
  • 如果你没有包括最后一行,那么在程序终止后,你的shell会在数字之上打印出提示符。
  • stdout.flush在某些系统上是必需的,否则你将不会得到任何输出。 其他系统可能不需要它,但它不会造成任何伤害。

如果你发现这不起作用,你应该怀疑的第一件事是你的terminal模拟器是越野车。 vttest程序可以帮助你testing它。

你可以用print语句replacestdout.write ,但是我不想将print和直接使用文件对象混合在一起。

使用print item,使打印语句省略换行符。

在Python 3中,它是print(item, end=" ")

如果你想让每个数字都显示在同一个地方,例如(Python 2.7):

 to = 20 digits = len(str(to - 1)) delete = "\b" * (digits + 1) for i in range(to): print "{0}{1:{2}}".format(delete, i, digits), 

在Python 3中,这有点复杂。 在这里你需要刷新sys.stdout或者直到循环结束之后才会打印任何内容:

 import sys to = 20 digits = len(str(to - 1)) delete = "\b" * (digits) for i in range(to): print("{0}{1:{2}}".format(delete, i, digits), end="") sys.stdout.flush() 

像其他例子一样,
我使用类似的方法,而不是花时间计算出最后的输出长度等,

我只是使用ANSI代码转义回到行的开始,然后在打印当前状态输出之前清除整行。

 import sys class Printer(): """Print things to stdout on one line dynamically""" def __init__(self,data): sys.stdout.write("\r\x1b[K"+data.__str__()) sys.stdout.flush() 

要在你的迭代循环中使用,你只需要调用如下所示:

 x = 1 for f in fileList: ProcessFile(f) output = "File number %d completed." % x Printer(output) x += 1 

在这里看到更多

您可以在打印语句中添加尾随逗号,以便在每次迭代中打印空格而不是换行符:

 print item, 

或者,如果您使用的是Python 2.6或更高版本,则可以使用新的打印function,这样可以指定每个打印项目的末尾都不应该有空格(或者允许指定任何结束想):

 from __future__ import print_function ... print(item, end="") 

最后,可以通过从sys模块中导入它直接写入标准输出,该模块返回一个类似文件的对象:

 from sys import stdout ... stdout.write( str(item) ) 

更改

 print item 

 print "\033[K", item, "\r", sys.stdout.flush() 
  • “\ 033 [K”清除到行尾
  • \ r,返回到行首
  • flush语句确保它立即显示出来,以便得到实时输出。

我认为一个简单的连接应该工作:

 nl = [] for x in range(1,10):nl.append(str(x)) print ' '.join(nl) 

“顺便说一句……如何每次刷新它,所以只需要在一个地方打印一下就可以了。”

这是非常棘手的话题。 zackbuild议(输出控制台控制代码)是实现这一点的一种方法。

你可以使用(n)curses,但主要用于* nixes。

在Windows上(这里有趣的部分)很less提及(我不明白为什么),你可以使用Python绑定到WinAPI(默认情况下也可以使用http://sourceforge.net/projects/pywin32/和ActivePython); – 这不是这很难,而且运作良好。 这是一个小例子:

 import win32console, time output_handle = win32console.GetStdHandle( win32console.STD_OUTPUT_HANDLE ) info = output_handle.GetConsoleScreenBufferInfo() pos = info["CursorPosition"] for i in "\\|/-\\|/-": output_handle.WriteConsoleOutputCharacter( i, pos ) time.sleep( 1 ) 

或者,如果你想使用print (声明或function,没有区别):

 import win32console, time output_handle = win32console.GetStdHandle( win32console.STD_OUTPUT_HANDLE ) info = output_handle.GetConsoleScreenBufferInfo() pos = info["CursorPosition"] for i in "\\|/-\\|/-": print i output_handle.SetConsoleCursorPosition( pos ) time.sleep( 1 ) 

win32console模块使您可以使用Windows控制台做更多有趣的事情…我并不是WinAPI的忠实粉丝,但是最近我意识到至less有一半的反对意见是由于在C – pythonic绑定中编写WinAPI代码更容易使用。

当然,所有其他的答案都是很好的pythonic,但是…如果我想在前一行打印呢? 或写多行文本,而不是清除它,并再次写入相同的行? 我的解决scheme使这成为可能

为了使数字相互覆盖,你可以做这样的事情:

 for i in range(1,100): print "\r",i, 

只要数字打印在第一列,这应该工作。

编辑:这是一个版本,即使它不是打印在第一列将工作。

 prev_digits = -1 for i in range(0,1000): print("%s%d" % ("\b"*(prev_digits + 1), i)), prev_digits = len(str(i)) 

我应该注意到这个代码已经过testing,在Windows的Python 2.5中,在WIndows控制台中工作得很好。 根据其他一些情况,可能需要刷新stdout来查看结果。 因人而异。

另一个我在2.7上使用的答案就是打印出“。” 每次循环运行(向用户指示事情仍在运行)是这样的:

 print "\b.", 

它打印“。” 每个字符之间没有空格。 它看起来好一点,工作得很好。 \ b是那些想知道的退格字符。

 for i in xrange(1,100): print i, 
 In [9]: print? Type: builtin_function_or_method Base Class: <type 'builtin_function_or_method'> String Form: <built-in function print> Namespace: Python builtin Docstring: print(value, ..., sep=' ', end='\n', file=sys.stdout) Prints the values to a stream, or to sys.stdout by default. Optional keyword arguments: file: a file-like object (stream); defaults to the current sys.stdout. sep: string inserted between values, default a space. end: string appended after the last value, default a newline. 

如果你只是想打印数字,你可以避免循环。

 # python 3 import time startnumber = 1 endnumber = 100 # solution A without a for loop start_time = time.clock() m = map(str, range(startnumber, endnumber + 1)) print(' '.join(m)) end_time = time.clock() timetaken = (end_time - start_time) * 1000 print('took {0}ms\n'.format(timetaken)) # solution B: with a for loop start_time = time.clock() for i in range(startnumber, endnumber + 1): print(i, end=' ') end_time = time.clock() timetaken = (end_time - start_time) * 1000 print('\ntook {0}ms\n'.format(timetaken)) 

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100花了21.1986929975ms

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100花了491.466823551ms

最好的方法是使用\r字符

只要尝试下面的代码:

 import time for n in range(500): print(n, end='\r') time.sleep(0.01) print() # start new line so most recently printed number stays 

对于Python 2.7

 for x in range(0, 3): print x, 

为Python 3

 for x in range(0, 3): print(x, end=" ") 

对于Python(2.7)

  l="" #empty string variable for item in range(1,100): item=str(item) #converting each element to string l=l+" "+item #concating each element l.lstrip() # deleting the space that was created initially print l #prining the whole string 

Python 3

  l="" for item in range(1,100): item=str(item) l=l+" "+item l.lstrip() print(l)