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

os.scandir()遍历刚下载文件的文件夹首次运行失效问题咨询

问题解决:下载文件后立即遍历筛选的实现

问题原因

核心问题是异步执行导致的时序错误:使用subprocess.Popen()启动wget下载任务后,脚本会直接跳转到后续遍历逻辑,此时wget还未完成文件下载,os.scandir()读取到的是下载前的空文件夹状态,自然无法找到可复制的文件。

解决方案

1. 强制等待下载任务完成

将异步启动的subprocess.Popen()改为阻塞式执行,确保文件全部下载完成后再开始遍历:

  • 方案一:使用subprocess.run()(推荐)
# 替换原Popen代码,等待wget执行完毕后再继续
subprocess.run(bash_commandList, stdout=subprocess.PIPE, check=True)
  • 方案二:给Popen加上wait()方法
proc = subprocess.Popen(bash_commandList, stdout=subprocess.PIPE)
proc.wait()  # 暂停脚本,直到wget进程结束

2. 修复遍历逻辑的冗余问题

原代码先打开文件再判断是否为HTML格式,可能会读取非目标文件,调整判断顺序优化逻辑:

job_as_string = ""
keywords = ["你的关键词列表"]  # 确保keywords变量已提前定义

# 遍历文件夹筛选目标文件
with os.scandir('/Users/user/wgetLinks') as parent:
    for job_stelle in parent:
        # 先确认是HTML格式的文件,再读取内容
        if job_stelle.is_file() and job_stelle.name.endswith(".html"):
            print(job_stelle.name)
            with open(job_stelle, 'r') as f:
                job_as_string = f.read()
            # 检查关键词并复制文件
            for keyword in keywords:
                if keyword in job_as_string:
                    target_path = '/Users/user/wgetInformatics/' + job_stelle.name
                    shutil.copy(job_stelle.path, target_path)
                    break  # 匹配到关键词后跳出循环,避免重复复制

补充说明

  • subprocess.run()的check=True参数会在wget执行失败时抛出异常,便于排查下载错误;
  • 原代码中的f.close()属于冗余操作,with open()上下文管理器会自动关闭文件;
  • 匹配到关键词后用break终止循环,避免同一文件被多次复制。

内容的提问来源于stack exchange,提问作者user24330119

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 22:03:22