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

查看:255
本文介绍了【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, onerror=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:

这篇关于【python2.7】将os.walk()转换为list后,为什么这个list的长度是0?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆