Python os.listdir选取随机图片报FileNotFoundError问题
问题原因
os.listdir() 方法仅会返回目标目录下的条目名称(文件名/子文件夹名),不会携带目录的完整路径前缀。
你之前的代码虽然成功从upload目录下枚举到了post.jpg这个文件名,但赋值给upload变量的只有纯文件名,后续执行open()操作时,程序会默认从Python脚本当前的运行工作目录下查找post.jpg,不会自动去你枚举文件的upload目录检索,自然会触发文件不存在的报错。
修复方法
核心是把枚举到的文件名和目标目录路径拼接成完整的文件绝对路径,再传给文件操作方法。
- 方案1:使用os模块标准写法(兼容所有Python版本)
import os import random # 定义图片存储目录的绝对路径 upload_path = "C:\\Instagram Bot\\Quote Script\\upload\\" # 遍历目录,过滤掉子文件夹,拼接每个文件的完整路径 all_images = [ os.path.join(upload_path, file_name) for file_name in os.listdir(upload_path) if os.path.isfile(os.path.join(upload_path, file_name)) ] # 随机选取一张图片的完整路径 upload = random.choice(all_images) # 后续读取文件直接使用upload变量即可 with open(upload, "rb") as fhandle: # 你的业务逻辑 pass
代码里加os.path.isfile()判断是为了避免随机选到upload目录下的子文件夹,导致后续读文件报错。
- 方案2:使用pathlib写法(Python 3.4+支持,路径处理更简洁)
from pathlib import Path import random upload_path = Path("C:/Instagram Bot/Quote Script/upload/") all_images = [file for file in upload_path.iterdir() if file.is_file()] upload = random.choice(all_images) with open(upload, "rb") as fhandle: # 你的业务逻辑 pass
排查小技巧
如果后续再遇到同类路径报错,可以先打印你要打开的文件路径,确认路径是否和文件实际存放位置一致:print(upload)
之前的错误写法打印出来只会是post.jpg,不是完整的C:\Instagram Bot\Quote Script\upload\post.jpg,一眼就能定位到路径拼接的问题。
内容的提问来源于stack exchange,提问作者user18465171
相关产品推荐
相关产品推荐

