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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 07:30:52