Python列出文件夹所有文件的5种方法详解
全面掌握Python中获取文件列表的各种技巧
学习要点: 本文将详细介绍Python中列出文件夹内所有文件的5种不同方法,包括基本方法和高级技巧,每种方法都配有实际可运行的代码示例。
为什么需要列出文件夹中的文件?
在Python编程中,经常需要处理文件和文件夹操作。无论是数据分析、文件管理还是自动化脚本,获取文件夹中的文件列表都是常见的需求场景:
- 批量处理某种类型的文件(如所有CSV或图片文件)
- 构建文件索引或搜索工具
- 自动化备份重要文件
- 监控文件夹内容变化
- 清理过期或临时文件
方法一:使用os.listdir() - 基本文件列表
os.listdir()
是Python中最简单直接的获取文件夹内容的方法,它返回指定路径下的所有文件和文件夹名称列表。
import os
def list_files_basic(directory):
"""列出目录中的所有文件和文件夹"""
return os.listdir(directory)
# 示例用法
path = "/path/to/your/directory"
all_items = list_files_basic(path)
print(f"{path}中的内容:")
for item in all_items:
print(item)
特点: 简单易用,但返回结果包含文件夹和文件,不递归子目录,不筛选文件类型
方法二:使用os.walk() - 递归遍历所有文件
os.walk()
是遍历目录树的最佳选择,它会递归访问所有子目录,返回每个目录路径及其包含的文件和文件夹。
import os
def list_files_recursive(directory):
"""递归列出目录中的所有文件"""
file_list = []
for root, dirs, files in os.walk(directory):
for file in files:
# 拼接完整文件路径
file_path = os.path.join(root, file)
file_list.append(file_path)
return file_list
# 示例用法
path = "/path/to/your/directory"
all_files = list_files_recursive(path)
print(f"{path}及其子目录中的所有文件:")
for file_path in all_files:
print(file_path)
特点: 功能强大,可递归访问所有子目录,适合需要处理整个目录树的场景
方法三:使用glob模块 - 模式匹配文件
glob
模块支持使用Unix shell风格的通配符来匹配文件路径,非常适合按模式查找文件。
import glob
def list_files_with_pattern(directory, pattern="*"):
"""使用模式匹配列出文件"""
search_pattern = os.path.join(directory, pattern)
return glob.glob(search_pattern)
# 示例用法
path = "/path/to/your/directory"
# 列出所有文件
all_files = list_files_with_pattern(path, "*")
print("所有文件:", all_files)
# 列出所有JPEG图片
jpeg_files = list_files_with_pattern(path, "*.jpg")
print("JPEG图片:", jpeg_files)
# 递归列出所有文本文件
text_files = list_files_with_pattern(path, "**/*.txt", recursive=True)
print("所有文本文件:", text_files)
特点: 强大的模式匹配能力,支持通配符(*, ?)和递归查找,简洁直观
方法四:使用pathlib模块 - 面向对象的文件路径操作
Python 3.4+ 引入了 pathlib
模块,提供了面向对象的文件系统路径操作方法,更符合Pythonic编程风格。
from pathlib import Path
def list_files_with_pathlib(directory):
"""使用pathlib列出文件"""
path = Path(directory)
# 列出当前目录文件
files_in_dir = [f for f in path.iterdir() if f.is_file()]
# 递归列出所有文件
all_files = list(path.rglob("*.*"))
# 列出特定类型文件
python_files = list(path.glob("**/*.py"))
return {
'current_dir': files_in_dir,
'all_files': all_files,
'python_files': python_files
}
# 示例用法
path = "/path/to/your/directory"
results = list_files_with_pathlib(path)
print("当前目录中的文件:")
for file in results['current_dir']:
print(file)
print("\n所有文件:")
for file in results['all_files']:
print(file)
特点: 面向对象API,代码更简洁,方法链式调用,支持递归查找
方法五:使用os.scandir() - 高性能目录扫描
Python 3.5+ 引入了 os.scandir()
,它比listdir()性能更好,特别是在Windows系统上处理大量文件时。
import os
def list_files_fast(directory):
"""使用scandir高效列出文件"""
with os.scandir(directory) as entries:
# 获取所有文件
files = [entry.name for entry in entries if entry.is_file()]
# 重置迭代器
entries = os.scandir(directory)
# 获取所有文件夹
dirs = [entry.name for entry in entries if entry.is_dir()]
return files, dirs
# 示例用法
path = "/path/to/your/directory"
files, directories = list_files_fast(path)
print("文件列表:")
for f in files:
print(f)
print("\n文件夹列表:")
for d in directories:
print(d)
特点: 性能优于listdir(),直接提供文件类型信息,适合处理大型目录
方法对比与选择建议
方法 | 递归能力 | 模式匹配 | 性能 | 适用场景 |
---|---|---|---|---|
os.listdir() | ❌ 不支持 | ❌ 不支持 | 中等 | 单层目录简单列表 |
os.walk() | ✅ 支持 | ❌ 不支持 | 良好 | 递归遍历整个目录树 |
glob.glob() | ✅ 支持 | ✅ 支持 | 良好 | 模式匹配文件查找 |
pathlib | ✅ 支持 | ✅ 支持 | 良好 | 现代Python文件操作 |
os.scandir() | ❌ 不支持 | ❌ 不支持 | 优秀 | 高性能单层目录扫描 |
选择建议:
- 需要简单快速获取当前目录内容 → os.listdir() 或 os.scandir()
- 需要递归遍历所有子目录 → os.walk() 或 pathlib.rglob()
- 需要模式匹配特定文件 → glob.glob() 或 pathlib.glob()
- 使用Python 3.4+ 并希望更Pythonic的代码 → pathlib
- 处理大量文件需要高性能 → os.scandir()
总结
本文详细介绍了Python中列出文件夹所有文件的5种核心方法:
os.listdir()、os.walk()、glob.glob()、pathlib 和 os.scandir()。
每种方法都有其适用场景:
- 对于简单目录列表,os.listdir() 和 os.scandir() 是理想选择
- 对于递归遍历,os.walk() 和 pathlib 最为强大
- 对于模式匹配文件查找,glob 模块提供了最简洁的语法
根据你的具体需求选择合适的方法,可以提高代码效率和可读性。现代Python项目推荐使用pathlib模块,它提供了更面向对象和Pythonic的文件系统操作方式。
发表评论