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]:后代码能运行但仍无输出,不知道如何修正。
问题分析与解决
错误点总结
- 语法错误:修改后的
if语句末尾缺少冒号:,导致代码无法正常执行。 - 判断对象错误:判断时误将
files/directories(文件/目录列表)作为检查对象,而非循环中的单个文件/目录名称name,逻辑完全错误。 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
相关产品推荐
相关产品推荐

