Python中的os.walk()函数

Python中的os.walk()函数

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

语法:

os.walk(top, topdown=True, onerror=None, followlinks=False)

os.walk() 的参数:

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

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

  • dirpath: 它是一个字符串,包含目录的路径。
  • dirnames: dirpath 的子目录以名称列表的形式列出。
  • filenames: 它是 dirpath 中非目录文件的名称列表。

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

import os
for dirpath, dirnames, filenames in os.walk('/path/to/directory'):
    for filename in filenames:
        print(os.path.join(dirpath, filename))

在这个示例中, 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语句逐个打开目录树中的每个文件并逐个处理,而不是一次加载所有文件名到内存中。下面是一个示例

import os
for dirpath, dirnames, filenames in os.walk('/path/to/directory'):
    for filename in filenames:
        filepath = os.path.join(dirpath, filename)
        with open(filepath, 'r') as f:
            # do something with the file

在这个示例中,每个文件都是用一个语句打开并在循环内部处理,所以一次只有一个文件在内存中。

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

import os
import shutil
source_dir = '/path/to/source/directory'
dest_dir = '/path/to/destination/directory'
for dirpath, dirnames, filenames in os.walk(source_dir):
    for filename in filenames:
        src_file = os.path.join(dirpath, filename)
        dest_file = os.path.join(dest_dir, filename)
        shutil.copy(src_file, dest_file)

这段代码将源目录树中的所有文件复制到目标目录中。

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

for dirpath, dirnames, filenames in os.walk('/path/to/directory'):
    filenames = [f for f in filenames if not f.endswith('.txt')]
    for filename in filenames:
        filepath = os.path.join(dirpath, filename)
        # process the file

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程