Python 获取目录下所有文件:完整且高效的指南
Updated on
在 Python 中列出目录中的文件是最常见的任务之一——无论你是在整理数据、预处理文件,还是在做自动化工作流。
在这篇更新的指南中,你将学习:
- 如何使用
os.listdir列出文件 - 如何使用
os.walk递归列出所有文件 - 如何按扩展名过滤文件
- 如何列出图片、视频或特定类型的文件
- 现代写法:使用 pathlib 来完成以上所有操作(当前推荐方式)
- 如何高效使用
glob通配符模式
总结速查 — 快速配方
| 任务 | 推荐方法 |
|---|---|
| 列出文件(非递归) | os.listdir 或 pathlib.Path.iterdir() |
| 递归列出所有文件 | os.walk 或 pathlib.Path.rglob() |
| 按扩展名过滤 | pathlib.Path.rglob("*.csv") |
| 模式匹配 / 通配符搜索 | glob.glob() / pathlib.Path.rglob("*pattern*") |
| 综合最佳选择 | pathlib |
1. 使用 os.listdir(基础、非递归)
os.listdir 会返回目录中的文件和文件夹名称,但不会进入子目录。
import os
def list_files(directory):
return os.listdir(directory)
print(list_files("/path/to/your/directory"))这会给出目录中的所有条目,但如果你想过滤或递归,就需要自己再写额外逻辑。对于现代 Python 代码,更推荐使用 pathlib(后文会讲),不过这个方式在快速脚本中依然很有用。
2. 使用 os.walk 递归列出所有文件
要遍历所有子目录并列出所有文件:
import os
def list_files_recursively(directory):
for root, dirs, files in os.walk(directory):
for file in files:
print(os.path.join(root, file))
list_files_recursively("/path/to/your/directory")os.walk 功能强大且内存友好,非常适合处理大型目录树。
3. 按扩展名过滤文件
可以在遍历时顺便做过滤:
import os
def list_files_by_extension(directory, extension):
for root, dirs, files in os.walk(directory):
for file in files:
if file.endswith(extension):
print(os.path.join(root, file))
list_files_by_extension("/path/to/your/directory", ".json")如果要匹配多种扩展名,可以使用 (".jpg", ".png") 这样的元组。
4. 列出图片或视频文件
列出图片文件:
import os
def list_image_files(directory):
image_ext = (".jpg", ".jpeg", ".png", ".gif", ".webp")
for root, dirs, files in os.walk(directory):
for file in files:
if file.lower().endswith(image_ext):
print(os.path.join(root, file))
list_image_files("/path/to/your/directory")列出视频文件:
import os
def list_video_files(directory):
video_ext = (".mp4", ".avi", ".mov", ".mkv")
for root, dirs, files in os.walk(directory):
for file in files:
if file.lower().endswith(video_ext):
print(os.path.join(root, file))
list_video_files("/path/to/your/directory")⭐ 全新推荐:使用 pathlib 的现代写法
自 Python 3.4 起,pathlib 成为处理路径的首选方式。
和 os.path 相比,它更易读,也更强大。
列出所有文件(非递归):
from pathlib import Path
def list_files(directory):
return [p for p in Path(directory).iterdir() if p.is_file()]
print(list_files("/path/to/dir"))递归列出所有文件:
from pathlib import Path
def list_files_recursive(directory):
return list(Path(directory).rglob("*"))
print(list_files_recursive("/path/to/dir"))按扩展名过滤:
from pathlib import Path
for file in Path("/path/to/dir").rglob("*.json"):
print(file)过滤多种类型:
from pathlib import Path
extensions = ("*.jpg", "*.png", "*.jpeg")
for ext in extensions:
for file in Path("path/to/dir").rglob(ext):
print(file)使用 pathlib,可以让代码非常简洁清晰。
5. 使用 glob 做模式匹配
当你需要类似 Shell 的通配符匹配时,glob 非常合适:
import glob
json_files = glob.glob("/path/to/your/directory/**/*.json", recursive=True)
print(json_files)常用模式示例:
"*.csv""data_*""**/*.jpg"(递归匹配)
总结
在这篇指南中,你学习了在 Python 中列出文件的多种方式:
- 使用
os.listdir做简单目录扫描 - 使用
os.walk做递归遍历 - 按扩展名过滤文件
- 处理图片、视频等特殊文件类型
- 使用
glob做通配符搜索 - 使用 pathlib —— 当前推荐的现代方案
无论你是在做数据清洗、编写文件自动化脚本,还是在机器学习工作流中处理数据,这些技巧都能帮助你写出更简洁、更高效、更易维护的 Python 代码。
常见问题(FAQs)
如何在 Python 中列出目录下的所有文件?
可以使用:
os.listdir(path)或者更现代的选择:
Path(path).iterdir()如何递归列出所有文件?
可以使用:
os.walk(path)或者:
Path(path).rglob("*")如何按扩展名过滤文件?
可以使用:
file.endswith(".json")或者:
Path(path).rglob("*.json")