Skip to content

Python 获取目录下所有文件:完整且高效的指南

Updated on

在 Python 中列出目录中的文件是最常见的任务之一——无论你是在整理数据、预处理文件,还是在做自动化工作流。

在这篇更新的指南中,你将学习:

  • 如何使用 os.listdir 列出文件
  • 如何使用 os.walk 递归列出所有文件
  • 如何按扩展名过滤文件
  • 如何列出图片、视频或特定类型的文件
  • 现代写法:使用 pathlib 来完成以上所有操作(当前推荐方式)
  • 如何高效使用 glob 通配符模式

总结速查 — 快速配方

任务推荐方法
列出文件(非递归)os.listdirpathlib.Path.iterdir()
递归列出所有文件os.walkpathlib.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")