`

从os.walk()来看生成器

阅读更多

在Python中,文件遍历是一件非常轻松简便的工作。官方给出的示例:

import os
    from os.path import join, getsize
    for root, dirs, files in os.walk('python/Lib/email'):
        print root, "consumes",
        print sum([getsize(join(root, name)) for name in files]),
        print "bytes in", len(files), "non-directory files"
        if 'CVS' in dirs:
            dirs.remove('CVS')  # don't visit CVS directories

 可以看到,基本上就是依赖os.walk()这个函数来实现的。从结构上来看,for root, dirs, files in os.walk(...),很容易让人认为os.walk(...)生成了一个迭代器。迭代器的next方法可能会返回下一层次的文件夹内容。事实上,os.walk()是一个生成器函数。生成器与迭代器,是Python引入的几大特性之一,而生成器要比迭代器高级一些。至于生成器的工作原理和适用场合,可以先从os.walk()的源码说起。

 

os.walk()源码:

def walk(top, topdown=True, onerror=None, followlinks=False):
    from os.path import join, isdir, islink

 try:
        # Note that listdir and error are globals in this module due
        # to earlier import-*.
        names = listdir(top)
    except error, err:
        if onerror is not None:
            onerror(err)
        return

    dirs, nondirs = [], []
    for name in names:
        if isdir(join(top, name)):
            dirs.append(name)
        else:
            nondirs.append(name)

    if topdown:
        yield top, dirs, nondirs
    for name in dirs:
        path = join(top, name)
        if followlinks or not islink(path):
            for x in walk(path, topdown, onerror, followlinks):
                yield x
    if not topdown:
        yield top, dirs, nondirs

 实现的原理很简单,首先列出top文件夹下所有的文件(夹)的名字,names,然后遍历每一个name,来判断name是文件夹还是文件,分别放到不同的列表中。这时,yield语句出现了,这正是生成器的魔法所在。任何包含yield语句的函数,都被称作是生成器函数。如何理解这个表达式呢,可以把它看做是和return一样的功效,即让函数返回结果。事实上,yield并不是单纯的return,它将top,dirs,noddirs返回后,就冻结了,就是说,这个函数不会再次执行。那什么时候会恢复执行呢,就是当你再次去调用walk方法的时候,此时,函数被激活,继续执行。

yield并没有太大特别之处,只不过它能够使函数的执行被冻结,并且能够被激活再次进入运行状态。那么,os.walk()就不再神秘了。再次进入运行态后,就会进入 递归调用了,即 for x in walk(path.....): yield x 的功能。

分享到:
评论

相关推荐

    python os.walk 遍历所有文件 文件夹(csdn)————程序.pdf

    `os.walk()`返回一个生成器,每次迭代都会返回一个三元组`(curDir, dirs, files)`: - `curDir`: 当前遍历到的目录路径。 - `dirs`: 一个列表,包含当前目录下的子目录名称。 - `files`: 一个列表,包含当前目录下...

    遍历[目录和文件](功能与python的os.walk一样)_walk函数_

    `os.walk()`从指定的目录开始,返回一个生成器,该生成器在每次迭代时提供三元组`(dirpath, dirnames, filenames)`,其中`dirpath`是当前目录的完整路径,`dirnames`是当前目录下的子目录名列表,`filenames`是当前...

    python使用os.listdir和os.walk获得文件的路径的方法

    - **返回值**: 生成器,返回一个包含三元素的元组 `(dirpath, dirnames, filenames)` 的序列。 - **`dirpath`**: 当前遍历到的目录的路径。 - **`dirnames`**: 列表形式,包含当前目录下的子目录名。 - **`...

    scandir:现在在Python 3.5 stdlib中具有更好的目录迭代器和更快的os.walk()

    scandir,更好的目录迭代器和更快的os.walk() scandir()是类似于os.listdir()的目录迭代函数,不同之处在于,它不返回裸文件名列表,而是生成DirEntry对象,该对象包含文件类型和统计信息以及名称。 使用scandir()...

    Python使用os.listdir和os.walk获取文件路径

    `os.walk` 会返回一个迭代器,可以生成指定目录及其子目录下的所有文件和目录的路径。 **示例代码**: ```python import os path = r'C:\Users\Administrator\Desktop\file' for dirpath, dirnames, filenames in...

    python 获取文件下所有文件或目录os.walk()的实例

    os.walk()函数返回的是一个迭代器,每次迭代返回一个三元组(root, dirs, files)。其中: - root:代表当前遍历到的目录路径。 - dirs:是一个列表,包含了当前目录下所有子目录的名字。 - files:是一个列表,包含了...

    python使用os模块的os.walk遍历文件夹示例

    if __name__ == ‘__main__’: try: ”’traval and list all files and all dirs”’ for root, dirs, files in os.walk(‘D:’ + os.sep + ‘Python27’): print ‘——————-directory < ‘ + root + ...

    Python使用os.listdir()和os.walk()获取文件路径与文件下所有目录的方法

    在python3.6版本中去掉了os.path.walk()函数 os.walk() 函数声明:walk(top,topdown=True,oneerror=None) 1、参数top表示需要遍历的目录树的路径 2、参数农户topdown默认是”True”,表示首先返回根目录树下的文件...

    对python中的 os.mkdir和os.mkdirs详解

    os.walk(path)函数能够做到这一点,返回一个迭代器,它会遍历path下的每一个目录,并返回一个三元组,包含当前目录的路径、它包含的子目录列表和文件列表。 os.path模块提供了两个用于检查路径类型的函数: - os....

    Python中文件遍历的两种方法

    关于Python的文件遍历,大概有两种方法,一种是较为便利的os.walk(),还有一种是利用os.listdir()递归遍历。 方法一:利用os.walk os.walk可以自顶向下或者自底向上遍历整个文件树,然后返回一个含有3个元素的tuple...

    the introduction of python os.zip_OND3_python os模块简介_youthot3

    os模块的`os.walk()`函数为此提供了解决方案,它可以递归地遍历目录树,返回每个目录下的所有子目录和文件名。这对于文件搜索、备份或清理任务非常有用。 os模块还提供了进程和环境变量的相关操作。`os.system()`...

    python os模块.pdf

    - os.walk(top, topdown=True, onerror=None, followlinks=False):生成目录树下的文件名,通过top参数指定顶层目录。 3. 文件路径相关函数: - os.path.abspath(path):返回path的绝对路径。 - os.path....

    Python获取指定文件夹下的文件名的方法

    本文采用os.walk()和os.listdir()两种方法,获取指定文件夹下的文件名。 一、os.walk() 模块os中的walk()函数可以遍历文件夹下所有的文件。 os.walk(top, topdown=Ture, onerror=None, followlinks=False) 该函数...

    deletefile

    现在,我们来看如何使用`os.walk()`来删除整个目录及其包含的文件和子目录。以下是一个名为`DeleteDir.py`的Python脚本示例: ```python import os def delete_directory(path): if os.path.exists(path) and os....

    os.txt.rar_目录下文件名

    在Python中,可以使用`os.walk()`函数递归地遍历目录及其子目录。 7. **文件属性**:在操作系统中,每个文件都有若干属性,包括但不限于大小、创建时间、修改时间、访问时间等。这些信息可以通过系统调用或特定的...

    python os操作整理

    22. `os.path.relpath(path[, start])`: 从指定的起始路径开始,生成相对于该起点的相对路径。 23. `os.path.samefile(path1, path2)`: 检查两个路径是否指向同一个文件。如果是,返回True;否则返回False。 24. `...

Global site tag (gtag.js) - Google Analytics