如何让Python函数逐个返回目录文件名以循环处理视频?
问题分析与解决方案
你的核心问题出在loop_dir()函数里——你用了return语句,这会让函数在找到第一个文件后就直接返回,所以每次调用这个函数都只会拿到同一个(第一个)文件名,自然循环里不会更新。我们需要把它改成生成器函数,用yield来逐个返回文件,这样每次迭代都能拿到下一个文件名。
另外,你的主循环里同时用了os.scandir和loop_dir(),逻辑有点重复,可以整合得更清晰;还有mk_dir()函数里的os.path.dirname属于多余操作,直接创建目标文件夹路径即可。
具体修改步骤:
重构
loop_dir()为生成器
把return换成yield,函数会变成一个迭代器,每次调用时逐个返回目录里的MP4文件名:def loop_dir(): for file in glob.glob('/Users/++++/+++/test/*.mp4'): yield str(file).split('/')[-1]简化
mk_dir()函数
去掉冗余的os.path.dirname,直接创建目标文件夹,逻辑更简洁:def mk_dir(): i = 1 while True: path = f"Folder_{i}/" if not os.path.exists(path): os.makedirs(path, exist_ok=False) return path i += 1调整主循环逻辑
遍历loop_dir()返回的文件名,每个文件对应创建一个新文件夹,再执行转换命令:for vid_name in loop_dir(): target_folder = mk_dir() os.system(f'python3 video2images.py -i /Users/++++/++++/test/{vid_name} \ -o /Users/++++/++++/{target_folder} \ --sample_interval 2 \ --max_frames 100')这里用f-string拼接命令,比字符串相加更清晰易读,也避免了不必要的转义。
完整修改后的代码:
import os import glob def loop_dir(): # 生成器:逐个返回MP4文件名 for file in glob.glob('/Users/++++/+++/test/*.mp4'): yield str(file).split('/')[-1] def mk_dir(): # 创建第一个不存在的Folder_i i = 1 while True: path = f"Folder_{i}/" if not os.path.exists(path): os.makedirs(path, exist_ok=False) return path i += 1 # 遍历每个视频文件,创建对应文件夹并执行转换命令 for vid_name in loop_dir(): target_folder = mk_dir() cmd = f'''python3 video2images.py \ -i /Users/++++/++++/test/{vid_name} \ -o /Users/++++/++++/{target_folder} \ --sample_interval 2 \ --max_frames 100''' os.system(cmd)
额外说明:
- 生成器函数(
yield)的好处是不会一次性把所有文件名加载到内存,适合处理大量文件的场景。 - 用f-string拼接命令比传统字符串相加更直观,也减少了出错概率。
- 如果你的
video2images.py支持批量处理,还能进一步优化流程,但目前的修改已经能解决你“逐个处理每个视频到对应新文件夹”的核心需求。
内容的提问来源于stack exchange,提问作者pristol
相关产品推荐
相关产品推荐

