- 在使用progressbar打印進度條時,發現open(‘a.txt’)不能打印進度條
網上demo
import time
import progressbar
bar = progressbar.ProgressBar(widgets=[
' [', progressbar.Timer(), '] ',
progressbar.Percentage(),
' (', progressbar.ETA(), ') ',
])
for i in bar(range(1000)):
time.sleep(0.01)
完美運行
我的test
import time
import progressbar
bar = progressbar.ProgressBar(widgets=[
' [', progressbar.Timer(), '] ',
progressbar.Percentage(),
' (', progressbar.ETA(), ') ',
])
for i in bar(open('a.txt')):
time.sleep(0.01)
崩了,而且沒看懂
- 發現python有三種可迭代的東西: 生成器、迭代器和可迭代對象
- 只要對象本身有__iter__方法,那它就是可以迭代的。
- 而迭代器有 __iter__之外還有__len__方法。
- 生成器如使用yield或者 [a**2 for a in range(10)]的形式,生成器都是迭代器,迭代器不一定是生成器。
# 判斷是不是可以迭代,用Iterable
# 判斷是不是迭代器,用Iterator
from collections import Iterable,Iterator #我們需要用到的模塊
s='hello'
l=[1,2,3]
t=(1,2,3)
d={'a':1}
set1={1,2,3,4}
f=open('a.txt')
# #都是可迭代的
s.__iter__() #都有__iter__方法
l.__iter__()
t.__iter__()
d.__iter__()
set1.__iter__()
f.__iter__()
#python官方推薦 判斷方式
# 是否是可以迭代的
print(isinstance(s,Iterable))
print(isinstance(l,Iterable))
print(isinstance(t,Iterable))
print(isinstance(d,Iterable))
print(isinstance(set1,Iterable))
print(isinstance(f,Iterable))
# 是否是迭代器,用Iterator
print(isinstance(s,Iterator))
print(isinstance(l,Iterator))
print(isinstance(t,Iterator))
print(isinstance(d,Iterator))
print(isinstance(set1,Iterator))
print(isinstance(f,Iterator))
# 有沒有len方法
s.__len__() #都有__iter__方法
l.__len__()
t.__len__()
d.__len__()
set1.__len__()
f.__len__()
f.len() 位於代碼第41行
由輸出知open是一個可迭代對象,但是不是迭代器,沒有__len__方法,沒法知道總的長度,跑進度條失敗,極有可能就是這點不同。
如果事先把文件遍歷一遍,求出總行數,也不值得,文件太大,罷了,就不對open用progressbar了。