当前位置:首页 > Python > 正文

Python列出文件夹所有文件的5种方法详解 | Python文件操作教程

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()pathlibos.scandir()

每种方法都有其适用场景:
- 对于简单目录列表,os.listdir()os.scandir() 是理想选择
- 对于递归遍历,os.walk()pathlib 最为强大
- 对于模式匹配文件查找,glob 模块提供了最简洁的语法

根据你的具体需求选择合适的方法,可以提高代码效率和可读性。现代Python项目推荐使用pathlib模块,它提供了更面向对象和Pythonic的文件系统操作方式。

发表评论