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

循环覆盖写入本地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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 09:36:03