python 之 sys.stdout输出不换行

时间:2022-11-21 11:48:53

  在处理程序打进度条时,希望不换行显示进度,可以使用sys.stdout相关函数来进行处理。

  1.print 输出不换行

  首先可以使用print函数来整体输入,利用,结尾就可以在同一行内显示:

  # python=2.7,py3.x print要加括号

  for i in range(10):

  print i,

  >>> 0 1 2 3 4 5 6 7 8 9

  但是这种方法只能在一行里连续输出,并且只能在换行时候才显示出来。

  2.sys.stdout进行实时显示

  为了进行实时显示,我们需要利用sys.stdout来实现。

  import sys

  for i in range(10):

  sys.stdout.write(str(i))

  sys.stdout.flush()

  # 输出连续的字符

  >>> 0123456789

  # 可以利用这个做一个进度条:

  sys.stdout.write('Processing>>>')

  for i in range(10):

  sys.stdout.write('*')

  sys.stdout.flush()

  >>> Processing>>>**********

  但是这种方法输出的是不断累加的,进度条会不断增加。如果想要输出百分数不断刷新精度就需要利用额外的方法了。

  3.回车或退格符的使用

  stdout.write将需要写的内容放到缓存里,而后flush来进行刷新。为了不换行不叠加的显示前文的信息,我们可以利用\r将光标移到行首,然后将前面的输出覆盖即可显示新的内容:

  for i in range(10):

  sys.stdout.write(str(i)+'\r')

  sys.stdout.flush()

  time.sleep(0.5)

  # 将依次输出0~9十个数字

  >>> 9

  # 我们可以输出对应的百分数进度

  for i in range(10):

  sys.stdout.write(str(i+1/1*10)+'%\r')

  sys.stdout.flush()

  time.sleep(0.5)

  # 将依次输出10%~100%

  >>> %100

  # 稍微改造一下就是很好看的进度条

  for i in range(10):

  bar_str = i * '>'

  sys.stdout.write(str((i+1)/1*10)+'%' + bar_str + '\r')

  sys.stdout.flush()

  time.sleep(0.5)郑州妇科医院哪家好 http://www.zzkedayy.com/

  # 可以直接copy上面的代码就可以输出下面的进度条样式,在同一行中刷新百分数,延长进度符号

  >>> 100%>>>>>>>>>

  除了使用\r外,还可以使用退格符号\b在进度条后进行刷新:

  for i in range(10):

  sys.stdout.write('*->'+ '\b\b') #为了不断加长中间的*,需要先将->删除再写入

  sys.stdout.flush()

  time.sleep(0.5)

  # 带箭头的进度条

  >>> **********->

  # 最后把百分数也加上

  for i in range(10):

  bar_str = i * '*' + '->'

  sys.stdout.write(str((i+1)/1*10)+'%' + bar_str + '\b\b\r')

  sys.stdout.flush()

  time.sleep(0.5)

  # 刷新百分数和逐渐增长的进度条:

  >>> 100%*********->