You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python递归搜索目录及子目录,找出含大写字母的文件和目录

问题描述

想要编写一个Python函数,递归搜索指定目录及其子目录、文件,并打印出名称包含大写字母的项。已完成大致代码,但无法正常打印出含大写字母的项。

文件夹结构

rootfolder
 |-subfolder1
  |-filelower1
  |-filelower2
  |-fileUpper1
 |-subfolder2
  |-filelower4
 |-subFolder3
  |-fileUpper2
  |-fileupPer3

现有代码

def check_name():
    directory = r'Folder Path'

    for d in next(os.walk(directory))[1]:
        itempath = os.path.join(directory, d)
        path = d
        
        #this recursion is working as intended, this prints out if 
        # 'rootfolder' has an uppercase.
        if any(letter.isupper() for letter in path):
            print("Found uppercase at:\n" + itempath)
        else:
            pass

    #this works correctly, but obviously this will print the entire path for
    #the directories and files, including the top level one, which isn't
    #how I would want this loop to work either way. 
    for root, directories, files in os.walk(directory):
        for name in files:
            print(os.path.join(root, name))
        for name in directories:
            print(os.path.join(root, name))

尝试修改后的问题

调整第二个循环为以下代码后无任何输出:

for root, directories, files in os.walk(directory):
    for name in files:
        if any(letter.isupper() for letter in files)
            print(os.path.join(root, name))
        else:
            pass
    for name in directories:
        if any(letter.isupper() for letter in directories)
            print(os.path.join(root, name))
        else:
            pass

后续尝试修改os.walk调用方式为for root, directories, files in os.walk(directory)[2]:,触发TypeError: 'generator' object is not subscriptable错误;改为for root, directories, files in next(os.walk(directory))[2]:后代码能运行但仍无输出,不知道如何修正。


问题分析与解决

错误点总结

  1. 语法错误:修改后的if语句末尾缺少冒号:,导致代码无法正常执行。
  2. 判断对象错误:判断时误将files/directories(文件/目录列表)作为检查对象,而非循环中的单个文件/目录名称name,逻辑完全错误。
  3. os.walk使用错误:os.walk返回生成器,不能直接用下标访问;next(os.walk(directory))[2]仅获取根目录下的文件列表,丢失了递归遍历子目录的逻辑。

正确实现代码

import os

def check_name():
    directory = r'Folder Path'  # 替换为你的目标目录路径

    # 递归遍历所有目录和文件
    for root, dirs, files in os.walk(directory):
        # 检查当前目录下的子目录
        for dir_name in dirs:
            if any(c.isupper() for c in dir_name):
                print(f"Found uppercase directory: {os.path.join(root, dir_name)}")
        # 检查当前目录下的文件
        for file_name in files:
            if any(c.isupper() for c in file_name):
                print(f"Found uppercase file: {os.path.join(root, file_name)}")

check_name()

代码说明

  • 利用os.walk递归遍历目录,每次迭代返回当前目录路径root、当前目录下的子目录列表dirs、当前目录下的文件列表files。
  • 对每个子目录名称dir_name和文件名称file_name单独检查是否包含大写字母,确保判断逻辑准确。
  • 用os.path.join(root, name)拼接完整路径,输出正确的文件/目录位置。

预期输出

针对给定的文件夹结构,运行后会输出:

Found uppercase file: rootfolder/subfolder1/fileUpper1
Found uppercase directory: rootfolder/subFolder3
Found uppercase file: rootfolder/subFolder3/fileUpper2
Found uppercase file: rootfolder/subFolder3/fileupPer3

内容的提问来源于stack exchange,提问作者Avila

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 04:45:09