循环覆盖写入本地PDF文件触发OS Error 22问题求助
问题修复方案
现存代码问题
- 冗余资源操作:
with open()上下文管理器会自动完成文件关闭逻辑,额外调用output_file.close()会造成重复释放资源错误;output_file.seek(0)在wb覆盖写入模式下完全无效,该模式打开文件时指针默认处于起始位置。 - 缺失响应校验:没有校验
File.open_binary的返回结果,前12个URL返回正常PDF二进制流,后续URL可能返回错误响应(如404、权限不足),无效内容写入时会触发IO异常。 - Windows平台文件占用冲突:PDF写入完成后,系统后台进程(杀毒软件、预览索引程序)可能临时占用文件,下一轮循环尝试打开被占用的文件时,就会抛出OSError 22错误。
修复后代码
import time # 固定文件名可以提到循环外,避免重复定义 filename = r'C:\Users\xxx\Documents\test.pdf' for x in list_urls: print(x) # 优先拉取远端资源并校验,减少本地文件占用时间 try: response = File.open_binary(ctx, x) # 基础校验:正常PDF文件大小不会低于100字节,可根据实际场景调整阈值 if not response.content or len(response.content) < 100: print(f"跳过异常URL:{x},响应内容为空或长度不符合PDF规范") continue except Exception as e: print(f"拉取URL {x} 资源失败,错误信息:{str(e)}") continue # 写入增加重试机制,解决偶发文件占用问题 retry_max = 3 write_ok = False while retry_max > 0 and not write_ok: try: with open(filename, 'wb') as output_file: output_file.write(response.content) write_ok = True except OSError as e: retry_max -= 1 print(f"写入失败,剩余重试次数:{retry_max},错误信息:{str(e)}") time.sleep(0.5) # 等待系统释放文件锁 if not write_ok: print(f"URL {x} 多次尝试写入失败,已跳过")
内容的提问来源于stack exchange,提问作者Jayashree Sridhar
相关产品推荐
相关产品推荐

