为何调用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是为了适配前端应用
问题原因与解决方法
核心忽略细节
ResumeParser不支持文件对象参数
pyresparser的ResumeParser构造函数仅接受文件路径字符串/字节/路径对象,不支持传入打开的BufferedWriter文件句柄,这是触发类型错误的直接原因。文件写入未完成就解析
即便支持文件对象,pdf.write(file_data)后立刻解析,内容可能还在缓冲区未写入磁盘,读取会失败。且with语句会自动关闭文件,手动调用pdf.close()属于多余操作,甚至会引发已关闭文件的IO错误。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
相关产品推荐
相关产品推荐

