【python】sys.stdout输出不换行

在处理程序打进度条时,希望不换行显示进度,可以使用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)
# 可以直接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%*********->

ref:
行内刷新:https://blog.csdn.net/weixin_30390075/article/details/98666769
行首,退格:https://www.jb51.net/article/55413.htm
sys.stdout:https://www.zhihu.com/question/48911955
https://blog.csdn.net/wuguangbin1230/article/details/77680058

在这里插入图片描述
pic from pexels.com

发布了357 篇原创文章 · 获赞 307 · 访问量 56万+

猜你喜欢

转载自blog.csdn.net/u014636245/article/details/103346195