Python 中的 os.walk()

2024 年 8 月 29 日 | 4 分钟阅读

os.walk() 是 Python 的 OS 模块中的一个函数,它通过自顶向下自底向上遍历目录树来生成目录树中的文件名。它可以用于在目录层级中搜索文件,或对目录树中的所有文件执行操作。

语法

os.walk() 的参数:

  • top: 这是遍历的起始目录。
  • topdown: 这是一个布尔值,用于确定遍历是自顶向下(从根目录到叶子)还是自底向上(从叶子到根目录)。
  • onerror: 这是一个在遍历过程中发生错误时调用的函数。如果未指定 onerror,则错误会打印到标准错误输出,并且遍历会继续。
  • followlinks: 这个布尔值决定了遍历是否会跟随符号链接。如果 followlinksTrue,则会跟随符号链接;如果为 False,则不会。

os.walk() 返回一个生成器对象,该对象为目录树中的每个目录生成一个3 元组 (dirpath, dirnames, filenames)。元组的每个部分代表:

  • dirpath: 包含目录路径的字符串。
  • dirnames: dirpath 的子目录名称列表。
  • filenames: dirpath 中非目录文件的名称列表。

以下是一个如何使用 os.walk() 打印目录树中所有文件名的示例:

在此示例中,使用 os.path.join() 将 dirpath 和 filename 连接起来,以创建每个文件的完整路径。它确保使用正确的路径分隔符,而不管操作系统如何。

关于 Python 中 'os.walk()' 的其他一些要点:

  1. 默认情况下,walk() 以自顶向下的方式遍历目录树。这意味着它从根目录开始,在访问每个目录中的文件之前,先访问树中的每个目录。如果要自底向上地遍历目录树,可以将 topdown=False 作为参数传递。
  2. 为每个目录返回的 dirnames 列表仅包含该目录的直接子目录的名称。如果要递归进入子目录,可以再次调用 os.walk() 来遍历每个子目录。
  3. 如果 followlinks 参数为 True,os.walk() 将会跟随符号链接并遍历链接的目录树。但是,请注意,如果符号链接在目录层级中形成循环,可能会导致无限循环。
  4. 您可以使用 onerror 参数指定一个函数,该函数将在遍历过程中发生错误时被调用。该函数应接受三个参数:引发的异常、正在遍历的目录以及错误的堆栈跟踪。如果未指定 onerroros.walk() 将错误消息打印到标准错误流并继续遍历。

如果目录树非常大,os.walk() 可能会占用大量内存。如果要最小化内存使用,可以使用 with 语句打开目录树中的每个文件并一次处理一个文件,而不是一次将所有文件名加载到内存中。这是一个例子:

在此示例中,每个文件都使用 with 语句打开并在循环内处理,因此一次只有一个文件在内存中。

os.walk() 可用于对目录树中的文件和目录执行各种操作,例如复制、移动删除文件。例如,您可以使用 shutil 模块将目录树中的所有文件复制到新位置:

此代码将 source_dir 目录树中的所有文件复制到 dest_dir 目录。

如果您需要在遍历过程中跳过某些目录或文件,可以在原地修改 dirnamesfilenames 列表以删除不需要的目录或文件。例如,如果要跳过具有特定扩展名的所有文件,可以使用列表推导式来过滤 filenames 列表: