python中open是可迭代对象但是不是迭代器

  1. 在使用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)

崩了,而且没看懂

  1. 发现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了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章