Python遍历子目录时如何获取文件完整路径并随机打开文件
问题根因
你的判断完全正确。os.walk()遍历目录时返回的file_names列表仅包含当前遍历层级下的文件名本身,不携带文件所在的目录路径。直接把这个孤立的文件名传给os.startfile()时,Python会默认在脚本运行的当前工作目录下查找对应文件,自然无法匹配到子目录里的文件,触发找不到文件的报错。
另外你原有代码还有个小隐患:循环变量和外层定义的根目录变量重名,会覆盖原始根目录值,虽然当前场景下不触发报错,但可读性差,容易在后续逻辑里出问题。
修复后可运行代码
import random import os from os import walk # 目标根目录 root_path = "M:/01_Bilder/01_Shootings" # 定义需要筛选的图片格式后缀,可自行增减 image_exts = {".jpg", ".jpeg", ".png", ".gif", ".bmp", ".webp", ".tiff"} # 存储符合要求的文件完整路径 all_image_files = [] for current_dir, _, file_names in walk(root_path): for file_name in file_names: # 拼接文件完整路径 file_full_path = os.path.join(current_dir, file_name) # 取文件后缀转小写,判断是否为图片 file_ext = os.path.splitext(file_name)[1].lower() if file_ext in image_exts: all_image_files.append(file_full_path) # 先判断目录下是否找到图片,避免空列表调用random.choice报错 if not all_image_files: print("指定目录下未找到符合要求的图片文件") else: selected_file = random.choice(all_image_files) print("选中打开的文件路径为:" + selected_file) os.startfile(selected_file)
关键逻辑说明
- 路径拼接统一用
os.path.join(),不要手动拼接字符串。这个方法会自动适配不同操作系统的路径分隔符(Windows用\、类Unix系统用/),避免斜杠、反斜杠写错导致的路径无效问题。 - 如果你不需要筛选图片、要获取目录下所有格式的文件,直接去掉后缀判断的逻辑,把拼接好的
file_full_path直接加入列表即可。 - 循环里用
_接收不需要用到的子目录名返回值,是Python里约定俗成的写法,代表这个变量后续不会被使用。 - 加非空判断是为了避免指定目录下没有匹配文件时,
random.choice()抛出索引越界的错误。
内容的提问来源于stack exchange,提问作者Slender4fun
相关产品推荐
相关产品推荐

