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()’的一些其他关键点
- 默认情况下, walk() 从顶部向下遍历目录树。它意味着从根目录开始,在访问每个目录中的文件之前,会访问树中的每个目录。如果你想从底部向上遍历目录树,可以将 topdown=False 作为参数传递。
- 返回给每个目录的 dirnames 列表仅包含该目录的直接子目录的名称。如果你想递归进入子目录,可以在每个子目录上再次调用os.walk()。
- 如果 followlinks 参数为 True ,os.walk()将跟踪符号链接并遍历链接的目录树。但要注意,如果符号链接在目录层次结构中形成一个循环,它可能导致无限循环。
- 你可以指定一个在遍历过程中发生错误时调用的函数,使用 onerror 。该函数应该接受三个参数:抛出的异常、正在遍历的目录和错误的回溯信息。如果未指定 onerror , os.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)
这段代码将源目录树中的所有文件复制到目标目录中。
如果你需要在遍历过程中跳过某些目录或文件,你可以修改 dirnames 或 filenames 列表来删除不需要的目录或文件。例如,如果你想跳过所有具有特定扩展名的文件,你可以使用列表推导式来过滤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