以下是几种使用Python获取给定目录下所有文件的方法:

方法一:使用 os.listdir()

import os

def get_files_in_directory(directory):
    """获取指定目录下的所有文件(不包含子目录)"""
    files = []
    for item in os.listdir(directory):
        item_path = os.path.join(directory, item)
        if os.path.isfile(item_path):
            files.append(item_path)
    return files

# 使用示例
directory_path = "/path/to/your/directory"
files = get_files_in_directory(directory_path)
for file in files:
    print(file)

方法二:使用 os.walk()(包含子目录)

import os

def get_all_files(directory):
    """获取指定目录及其所有子目录下的文件"""
    all_files = []
    for root, dirs, files in os.walk(directory):
        for file in files:
            file_path = os.path.join(root, file)
            all_files.append(file_path)
    return all_files

# 使用示例
directory_path = "/path/to/your/directory"
all_files = get_all_files(directory_path)
for file in all_files:
    print(file)

方法三:使用 pathlib(Python 3.4+ 推荐)

from pathlib import Path

def get_files_pathlib(directory):
    """使用pathlib获取目录下的所有文件"""
    path = Path(directory)
    # 仅当前目录
    files = [f for f in path.iterdir() if f.is_file()]
    # 包含子目录
    all_files = list(path.rglob('*'))
    all_files = [f for f in all_files if f.is_file()]
    return all_files

# 使用示例
directory_path = "/path/to/your/directory"
files = get_files_pathlib(directory_path)
for file in files:
    print(file)

方法四:使用 glob(支持模式匹配)

import glob

def get_files_glob(directory, pattern="*"):
    """使用glob获取匹配特定模式的文件"""
    # 仅当前目录
    files = glob.glob(f"{directory}/{pattern}")
    files = [f for f in files if os.path.isfile(f)]
    
    # 包含子目录
    all_files = glob.glob(f"{directory}/**/{pattern}", recursive=True)
    all_files = [f for f in all_files if os.path.isfile(f)]
    return all_files

# 使用示例
directory_path = "/path/to/your/directory"
# 获取所有.txt文件
txt_files = get_files_glob(directory_path, "*.txt")
for file in txt_files:
    print(file)

完整示例:带错误处理

import os
from pathlib import Path

def get_files_safe(directory):
    """安全地获取目录中的所有文件(带错误处理)"""
    if not os.path.exists(directory):
        raise FileNotFoundError(f"目录不存在: {directory}")
    
    if not os.path.isdir(directory):
        raise NotADirectoryError(f"路径不是目录: {directory}")
    
    all_files = []
    try:
        for root, dirs, files in os.walk(directory):
            for file in files:
                file_path = os.path.join(root, file)
                all_files.append(file_path)
    except PermissionError:
        print(f"警告: 没有权限访问 {directory} 中的某些目录")
    
    return all_files

# 使用示例
try:
    directory_path = "/path/to/your/directory"
    files = get_files_safe(directory_path)
    print(f"找到 {len(files)} 个文件:")
    for file in files:
        print(file)
except Exception as e:
    print(f"错误: {e}")

选择哪种方法取决于你的具体需求:

  • 如果只需要当前目录的文件,使用 os.listdir() 或 pathlib.Path.iterdir()

  • 如果需要递归获取所有子目录的文件,使用 os.walk() 或 pathlib.Path.rglob()

  • 如果需要模式匹配,使用 glob

  • 对于新项目,推荐使用 pathlib,因为它提供了更面向对象和直观的API