python长度转换程序_【python2.7】将os.walk()转换为list后,为什么这个list的长度是0?...

问 题

在用os.walk()时候,出错,如下图。

list(walk)的长度明明是1,为啥总是python总是说len(list(walk))是0?

对应的目录如下图:

困扰我两天了,求点拨。谢谢!

解决方案

建议你看看生成器/yield,你也可以看看两次执行list(os.walk(path))返回的值。看完你才能大致了解为什么执行第二次list(generator)不会有任何结果。这个生成器你可以把它当成类似于文件读取,只不过它不提供seek操作,所以第一次你读到了尾,第二次再往下就读不出什么来了。下面是os.walk的源码,我写了注释,你自己看看。

def walk(top, topdown=True, οnerrοr=None, followlinks=False):

#这是2.7 os.walk的源码

islink, join, isdir = path.islink, path.join, path.isdir

try:

names = listdir(top) #获取top目录下的所有名称

except error, err:

if onerror is not None:

onerror(err) #错误处理,skip掉

return

#正文开始

dirs, nondirs = [], [] #用来存储文件夹与非文件夹的数组

for name in names: #遍历top目录下的所有子路径

if isdir(join(top, name)):

dirs.append(name) #如果子路径指向文件夹,只将其存储到dirs数组中用于接下来的递归

else:

nondirs.append(name) #如果子路径指向文件,将其存储至nondirs数组

if topdown:

yield top, dirs, nondirs # yield出第一组结果

for name in dirs:

new_path = join(top, name) # 遍历刚才的文件夹list, 准备walk root下的子文件夹

if followlinks or not islink(new_path):

#如果不是link, 那么就是文件夹,那么就需要看看它下面的目录是什么情况。

for x in walk(new_path, topdown, onerror, followlinks):

yield x # 返回walk的结果, for循环类似于启动生成器的一个trigger

if not topdown:

扫一扫关注IT屋

微信公众号搜索 “ IT屋 ” ,选择关注与百万开发者在一起

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值