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
相关产品推荐
相关产品推荐

