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

为何调用ResumeParser时出现TypeError:期望路径类对象而非BufferedWriter

问题:pyresparser ResumeParser 传入文件对象触发类型错误

代码示例

@app.get('/resume')
async def resume():
    path = os.path.abspath(os.getcwd())
    with open(f'{path}/cv.pdf', 'rb') as f:
        data_binary = f.read()
        file_data = base64.b64encode(data_binary)

    with open(f'{path}/sample.pdf','wb') as pdf:
        pdf.write(file_data)
        parsed_data = ResumeParser(pdf).get_extracted_data()
    pdf.close()
    return await process_pdf(parsed_data)

错误信息

执行parsed_data = ResumeParser(pdf).get_extracted_data()时触发:

TypeError: expected str, bytes or os.PathLike object, not BufferedWriter

直接传入文件路径parsed_data = ResumeParser(f'{path}/cv.pdf').get_extracted_data()可正常运行。

补充上下文

  • 已尝试用BytesIO将base64文件转为字节
  • ResumeParser来自pyresparser包
  • 文件系统中从未生成sample.pdf文件
  • 将PDF转为base64是为了适配前端应用

问题原因与解决方法

核心忽略细节

  1. ResumeParser不支持文件对象参数
    pyresparser的ResumeParser构造函数仅接受文件路径字符串/字节/路径对象,不支持传入打开的BufferedWriter文件句柄,这是触发类型错误的直接原因。

  2. 文件写入未完成就解析
    即便支持文件对象,pdf.write(file_data)后立刻解析,内容可能还在缓冲区未写入磁盘,读取会失败。且with语句会自动关闭文件,手动调用pdf.close()属于多余操作,甚至会引发已关闭文件的IO错误。

  3. base64编码内容生成的是无效PDF
    你将原PDF二进制做base64编码后写入文件,生成的sample.pdf本质是base64字符串的二进制,并非合法PDF文件,就算传路径给ResumeParser也无法正常解析。

修正方案

方案1:分离解析与base64生成(最稳妥)

直接用原始PDF路径解析,同时生成base64给前端,避免无效文件操作:

@app.get('/resume')
async def resume():
    path = os.path.abspath(os.getcwd())
    pdf_path = f'{path}/cv.pdf'
    
    # 解析原始PDF
    parsed_data = ResumeParser(pdf_path).get_extracted_data()
    
    # 生成适配前端的base64字符串
    with open(pdf_path, 'rb') as f:
        data_binary = f.read()
        file_data_base64 = base64.b64encode(data_binary).decode('utf-8')
    
    # 可根据需求返回解析结果和base64
    processed_result = await process_pdf(parsed_data)
    return {"processed_data": processed_result, "pdf_base64": file_data_base64}

方案2:用BytesIO包装原始二进制(减少文件读取次数)

若不想重复读取文件,可将原始二进制用BytesIO包装后传入ResumeParser(部分pyresparser版本支持字节流):

@app.get('/resume')
async def resume():
    path = os.path.abspath(os.getcwd())
    with open(f'{path}/cv.pdf', 'rb') as f:
        data_binary = f.read()
    
    # 生成base64给前端
    file_data_base64 = base64.b64encode(data_binary).decode('utf-8')
    
    # 用BytesIO包装原始二进制解析
    from io import BytesIO
    parsed_data = ResumeParser(BytesIO(data_binary)).get_extracted_data()
    
    return await process_pdf(parsed_data)

额外注意事项

  • 禁止用base64编码内容生成PDF文件,此类文件无法被正常解析。
  • 依赖with语句管理文件生命周期,无需手动调用close()。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 13:30:17