本教程介绍如何使用Python编程语言高效地遍历指定目录下的所有文件和子目录,并提供实用示例代码。
### Python遍历目录中的所有文件的方法
在Python中,遍历目录并获取其中的所有文件是一项常见任务,尤其是在处理大量文件时。本段落将详细介绍如何使用`os.walk`生成器来完成这项工作,并进一步介绍如何结合`fnmatch`模块来增强文件筛选功能。
#### 一、使用`os.walk`遍历目录
`os.walk`是一个非常强大的工具,用于遍历目录树。它返回一个生成器,每次迭代都会产生一个包含三个元素的元组:当前目录路径、当前目录下的子目录列表以及当前目录下的文件列表。
**基本用法:**
```python
import os
for root, dirs, files in os.walk(path_to_directory):
print(Root:, root)
print(Directories:, dirs)
print(Files:, files)
```
这里,`root`是当前目录的路径,`dirs`是当前目录下的子目录列表,而`files`则是当前目录下的文件列表。
**高级用法示例:**
假设我们需要找到所有HTML文件:
```python
result = []
for dp, dn, fs in os.walk(_pages):
for f in fs:
if os.path.splitext(f)[1] == .html:
result.append(os.path.join(dp, f))
# 或者使用列表推导式简化代码
result = [os.path.join(dp, f) for dp, dn, fs in os.walk(_pages) for f in fs if os.path.splitext(f)[1] == .html]
```
这段代码首先遍历`_pages`目录及其子目录,然后检查每个文件的扩展名是否为`.html`,如果是,则将其路径添加到结果列表中。
#### 二、使用`fnmatch`模块进行更复杂的文件筛选
虽然`os.walk`非常有用,但它并不能直接提供对文件名进行模式匹配的功能。这时候我们可以结合使用`fnmatch`模块来实现这一需求。
**`fnmatch`模块介绍:**
- `fnmatch.fnmatch(name, pattern)`:用于测试`name`是否匹配`pattern`,返回布尔值。
- `fnmatch.filter(names, pat)`:从`names`列表中筛选出所有匹配`pat`的元素,并返回这些元素的新列表。
**示例代码:**
```python
import os
import fnmatch
def filter_files(dirname, patterns=*, single_level=False, yield_folders=False):
patterns = patterns.split(;)
all_files = []
for root_dir, sub_dirs, files in os.walk(dirname):
print(sub_dirs)
all_files.extend(files)
if yield_folders:
all_files.extend(sub_dirs)
if single_level:
break
all_files.sort()
for each_pattern in patterns:
for each_file in fnmatch.filter(all_files, each_pattern):
print(os.path.normpath(each_file))
# 使用示例
filter_files(pathtodirectory, *.txt;*.py)
```
这段代码定义了一个`filter_files`函数,它可以接收目录路径、文件模式、是否只遍历一层以及是否包含文件夹等参数。通过这种方式,我们可以更加灵活地控制遍历过程。
#### 三、总结
通过上述内容,我们了解到了使用`os.walk`和`fnmatch`模块来遍历目录并筛选文件的基本方法。`os.walk`是一个强大的工具,能够帮助我们轻松地遍历目录结构;而`fnmatch`则提供了额外的灵活性,允许我们基于模式来筛选文件。这些技巧在处理大量文件时非常有用,可以帮助我们更加高效地完成任务。