python控制台进度条_Python中如何写控制台进度条的整理

本文实例讲述了Python显示进度条的方法,是Python程序设计中非常实用的技巧。分享给大家供大家参考。具体方法如下:

首先,进度条和一般的print区别在哪里呢?

答案就是print会输出一个\n,也就是换行符,这样光标移动到了下一行行首,接着输出,之前已经通过stdout输出的东西依旧保留,而且保证我们在下面看到最新的输出结果。

进度条不然,我们必须再原地输出才能保证他是一个进度条,否则换行了怎么还叫进度条?

最简单的办法就是,再输出完毕后,把光标移动到行首,继续在那里输出更长的进度条即可实现,新的更长的进度条把旧的短覆盖,就形成了动画效果。

可以想到那个转义符了吧,那就是\ r。

转义符r就可以把光标移动到行首而不换行,转义符n就把光标移动到行首并且换行。

在python中,输出stdout(标准输出)可以使用sys.stdout.write

例如:

Python

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

#!/usr/bin/env python

# -*- coding=utf-8 -*-

#Using GPL v2

#Author: ihipop@gmail.com

##2010-10-27 22:07

"""

Usage:

Just A Template

"""

from__future__importdivision

importsys,time

j='#'

if__name__=='__main__':

foriinrange(1,61):

j+='#'

sys.stdout.write(str(int((i/60)*100))+'% ||'+j+'->'+"\r")

sys.stdout.flush()

time.sleep(0.5)

print

第二种思路是用转义符\b

转义符\b是退格键,也就是说把输出的光标往回退格子,这样就可以不用+=了,例如:

Python

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

#!/usr/bin/env python

# -*- coding=utf-8 -*-

#Using GPL v2

#Author: ihipop@gmail.com

#2010-10-27 22:07

"""

Usage:

Just A Template

"""

from__future__importdivision

importsys,time

if__name__=='__main__':

foriinrange(1,61):

sys.stdout.write('#'+'->'+"\b\b")

sys.stdout.flush()

time.sleep(0.5)

print

光标回退2格,写个#再回退,再写,达到增长的目的了

不过写这么多似乎是废话,在耳边常常听到一句话:那就是不要重复造轮子。实际上python有丰富发lib帮你实现这个东西,你完全可以把心思放在逻辑开发上而不用注意这些小细节的百度云网盘搜索

下面要介绍的就是这个类“progressbar”(http://code.google.com/p/python-progressbar/),使用easy_install可以方便的安装这个类库,其实就一个文件,拿过来放到文件同一个目录下面也直接可以import过来

如下图所示:

下面就是基本使用举例:

Python

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

#!/usr/bin/env python

# -*- coding=utf-8 -*-

#Using GPL v2

#Author: ihipop@gmail.com

#2010-10-27 22:53

"""

Usage:

Just A Template

"""

from__future__importdivision

importsys,time

fromprogressbar import*

total=1000

#基本用法

progress=ProgressBar()

foriinprogress(range(total)):

time.sleep(0.01)

pbar=ProgressBar().start()

foriinrange(1,1000):

pbar.update(int((i/(total-1))*100))

time.sleep(0.01)

pbar.finish()

#高级用法

widgets=['Progress: ',Percentage(),' ',Bar(marker=RotatingMarker('>-=')),

' ',ETA(),' ',FileTransferSpeed()]

pbar=ProgressBar(widgets=widgets,maxval=10000000).start()

foriinrange(1000000):

# do something

pbar.update(10*i+1)

time.sleep(0.0001)

pbar.finish()

官方示例:http://code.google.com/p/python-progressbar/source/browse/progressbar/examples.py

Python

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

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

199

200

201

202

203

204

205

206

207

208

209

210

211

212

213

214

215

216

# coding:utf-8

importsys

importtime

fromprogressbar importAnimatedMarker,Bar,BouncingBar,Counter,ETA,\

FileTransferSpeed,FormatLabel,Percentage,\

ProgressBar,ReverseBar,RotatingMarker,\

SimpleProgress,Timer

examples=[]

defexample(fn):

try:

name='Example %d'%int(fn.__name__[7:])

except:

name=fn.__name__

defwrapped():

try:

sys.stdout.write('Running: %s\n'%name)

fn()

sys.stdout.write('\n')

exceptKeyboardInterrupt:

sys.stdout.write('\nSkipping example.\n\n')

examples.append(wrapped)

returnwrapped

@example

defexample0():

pbar=ProgressBar(widgets=[Percentage(),Bar()],maxval=300).start()

foriinrange(300):

time.sleep(0.01)

pbar.update(i+1)

pbar.finish()

@example

defexample1():

widgets=['Test: ',Percentage(),' ',Bar(marker=RotatingMarker()),

' ',ETA(),' ',FileTransferSpeed()]

pbar=ProgressBar(widgets=widgets,maxval=10000000).start()

foriinrange(1000000):

# do something

pbar.update(10*i+1)

pbar.finish()

@example

defexample2():

classCrazyFileTransferSpeed(FileTransferSpeed):

"""It's bigger between 45 and 80 percent."""

defupdate(self,pbar):

if45

return'Bigger Now '+FileTransferSpeed.update(self,pbar)

else:

returnFileTransferSpeed.update(self,pbar)

widgets=[CrazyFileTransferSpeed(),' <<>> ',

Percentage(),' ',ETA()]

pbar=ProgressBar(widgets=widgets,maxval=10000000)

# maybe do something

pbar.start()

foriinrange(2000000):

# do something

pbar.update(5*i+1)

pbar.finish()

@example

defexample3():

widgets=[Bar('>'),' ',ETA(),' ',ReverseBar('

pbar=ProgressBar(widgets=widgets,maxval=10000000).start()

foriinrange(1000000):

# do something

pbar.update(10*i+1)

pbar.finish()

@example

defexample4():

widgets=['Test: ',Percentage(),' ',

Bar(marker='0',left='[',right=']'),

' ',ETA(),' ',FileTransferSpeed()]

pbar=ProgressBar(widgets=widgets,maxval=500)

pbar.start()

foriinrange(100,500+1,50):

time.sleep(0.2)

pbar.update(i)

pbar.finish()

@example

defexample5():

pbar=ProgressBar(widgets=[SimpleProgress()],maxval=17).start()

foriinrange(17):

time.sleep(0.2)

pbar.update(i+1)

pbar.finish()

@example

defexample6():

pbar=ProgressBar().start()

foriinrange(100):

time.sleep(0.01)

pbar.update(i+1)

pbar.finish()

@example

defexample7():

pbar=ProgressBar()# Progressbar can guess maxval automatically.

foriinpbar(range(80)):

time.sleep(0.01)

@example

defexample8():

pbar=ProgressBar(maxval=80)# Progressbar can't guess maxval.

foriinpbar((iforiinrange(80))):

time.sleep(0.01)

@example

defexample9():

pbar=ProgressBar(widgets=['Working: ',AnimatedMarker()])

foriinpbar((iforiinrange(50))):

time.sleep(.08)

@example

defexample10():

widgets=['Processed: ',Counter(),' lines (',Timer(),')']

pbar=ProgressBar(widgets=widgets)

foriinpbar((iforiinrange(150))):

time.sleep(0.1)

@example

defexample11():

widgets=[FormatLabel('Processed: %(value)d lines (in: %(elapsed)s)')]

pbar=ProgressBar(widgets=widgets)

foriinpbar((iforiinrange(150))):

time.sleep(0.1)

@example

defexample12():

widgets=['Balloon: ',AnimatedMarker(markers='.oO@* ')]

pbar=ProgressBar(widgets=widgets)

foriinpbar((iforiinrange(24))):

time.sleep(0.3)

@example

defexample13():

# You may need python 3.x to see this correctly

try:

widgets=['Arrows: ',AnimatedMarker(markers='←↖↑↗→↘↓↙')]

pbar=ProgressBar(widgets=widgets)

foriinpbar((iforiinrange(24))):

time.sleep(0.3)

exceptUnicodeError:

sys.stdout.write('Unicode error: skipping example')

@example

defexample14():

# You may need python 3.x to see this correctly

try:

widgets=['Arrows: ',AnimatedMarker(markers='◢◣◤◥')]

pbar=ProgressBar(widgets=widgets)

foriinpbar((iforiinrange(24))):

time.sleep(0.3)

exceptUnicodeError:

sys.stdout.write('Unicode error: skipping example')

@example

defexample15():

# You may need python 3.x to see this correctly

try:

widgets=['Wheels: ',AnimatedMarker(markers='◐◓◑◒')]

pbar=ProgressBar(widgets=widgets)

foriinpbar((iforiinrange(24))):

time.sleep(0.3)

exceptUnicodeError:

sys.stdout.write('Unicode error: skipping example')

@example

defexample16():

widgets=[FormatLabel('Bouncer: value %(value)d - '),BouncingBar()]

pbar=ProgressBar(widgets=widgets)

foriinpbar((iforiinrange(180))):

time.sleep(0.05)

@example

defexample17():

widgets=[FormatLabel('Animated Bouncer: value %(value)d - '),

BouncingBar(marker=RotatingMarker())]

pbar=ProgressBar(widgets=widgets)

foriinpbar((iforiinrange(180))):

time.sleep(0.05)

@example

defexample18():

widgets=[Percentage(),

' ',Bar(),

' ',ETA(),

' ',AdaptiveETA()]

pbar=ProgressBar(widgets=widgets,maxval=500)

pbar.start()

foriinrange(500):

time.sleep(0.01+(i<100)*0.01+(i>400)*0.9)

pbar.update(i+1)

pbar.finish()

@example

defexample19():

pbar=ProgressBar()

foriinpbar([]):

pass

pbar.finish()

try:

forexample inexamples:

example()

exceptKeyboardInterrupt:

sys.stdout('\nQuitting examples.\n')

再发一个类:

Python

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

#!/usr/bin/env python

# -*- coding=utf-8 -*-

#Using GPL v2

#Author: ihipop@gmail.com

#2010-10-30 13:59

"""

Usage:

Just A Template

"""

classprogressbarClass:

def__init__(self,finalcount,progresschar=None):

importsys

self.finalcount=finalcount

self.blockcount=0

#

# See if caller passed me a character to use on the

# progress bar (like "*"). If not use the block

# character that makes it look like a real progress

# bar.

#

ifnotprogresschar:self.block=chr(178)

else:self.block=progresschar

#

# Get pointer to sys.stdout so I can use the write/flush

# methods to display the progress bar.

#

self.f=sys.stdout

#

# If the final count is zero, don't start the progress gauge

#

ifnotself.finalcount:return

self.f.write('\n------------------- % Progress -------------------\n')

return

defprogress(self,count):

#

# Make sure I don't try to go off the end (e.g. >100%)

#

count=min(count,self.finalcount)

#

# If finalcount is zero, I'm done

#

ifself.finalcount:

percentcomplete=int(round(100*count/self.finalcount))

ifpercentcomplete<1:percentcomplete=1

else:

percentcomplete=100

#print "percentcomplete=",percentcomplete

blockcount=int(percentcomplete/2)

#print "blockcount=",blockcount

ifblockcount>self.blockcount:

foriinrange(self.blockcount,blockcount):

self.f.write(self.block)

self.f.flush()

ifpercentcomplete==100:self.f.write("\n")

self.blockcount=blockcount

return

if__name__=="__main__":

fromtimeimportsleep

pb=progressbarClass(8,"*")

count=0

whilecount<9:

count+=1

pb.progress(count)

sleep(0.2)

另外,python cookbook中11.1节也提供了一个不错的进度条类,代码如下:

Python

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

importsys

classprogressbar(object):

def__init__(self,finalcount,block_char='.'):

self.finalcount=finalcount

self.blockcount=0

self.block=block_char

self.f=sys.stdout

ifnotself.finalcount:

return

self.f.write('\n------------------ % Progress -------------------1\n')

self.f.write(' 1 2 3 4 5 6 7 8 9 0\n')

self.f.write('----0----0----0----0----0----0----0----0----0----0\n')

defprogress(self,count):

count=min(count,self.finalcount)

ifself.finalcount:

percentcomplete=int(round(100.0*count/self.finalcount))

ifpercentcomplete<1:

percentcomplete=1

else:

percentcomplete=100

blockcount=int(percentcomplete//2)

ifblockcount<=self.blockcount:

return

foriinrange(self.blockcount,blockcount):

self.f.write(self.block)

self.f.flush()

self.blockcount=blockcount

ifpercentcomplete==100:

self.f.write("\n")

if__name__=="__main__":

fromtimeimportsleep

pb=progressbar(8,"*")

forcount inrange(1,9):

pb.progress(count)

sleep(0.2)

pb=progressbar(100)

pb.progress(20)

sleep(0.3)

pb.progress(47)

sleep(0.3)

pb.progress(90)

sleep(0.3)

pb.progress(100)

print"testing 1:"

pb=progressbar(1)

pb.progress(1)

运行结果如下图所示:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值