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了。

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