Flask中使用Textract读取上传文件遇类型错误的技术问询
解决Textract处理上传文件流时的TypeError问题
你遇到的问题核心在于textract.process()没法直接处理内存中的文件流——尤其是处理.docx这类需要依赖外部库/工具的格式时,它底层会调用os.stat()检查文件路径,但你传入的request_file.stream是文件对象而非字符串格式的路径,所以触发了类型错误。
问题根源拆解
Textract对不同文件格式的处理逻辑有差异:
- 纯文本(.txt)可以直接读取流内容;
- 但.docx、.pdf这类格式,它需要实际的文件路径来调用对应处理工具,没法直接操作内存中的流对象。
解决方案:临时文件中转
我们可以先把上传的文件内容保存到临时文件里,再把临时文件路径传给textract,处理完成后删除临时文件,这样就能兼容所有支持的格式了。
修正后的代码如下:
from flask import Flask, request import textract import tempfile import os app = Flask(__name__) @app.route('/upload', methods=['POST']) def upload(): request_file = request.files['file'] # 创建带原文件后缀的临时文件,方便textract识别格式 with tempfile.NamedTemporaryFile(delete=False, suffix=os.path.splitext(request_file.filename)[1]) as temp_file: temp_file.write(request_file.stream.read()) temp_file_path = temp_file.name try: # 传入临时文件路径完成内容提取 text = textract.process(temp_file_path) return text finally: # 无论处理成功或失败,都清理临时文件避免磁盘占用 os.unlink(temp_file_path)
关键细节说明
tempfile.NamedTemporaryFile(delete=False):创建不自动删除的临时文件,确保我们能在with块外部访问它的路径;- 保留原文件扩展名:让textract能正确识别文件类型,调用对应的处理逻辑;
finally块:保证临时文件一定会被删除,防止磁盘资源泄漏。
这样修改后,不管上传.txt、.docx还是.pdf,textract都能正常处理了。
内容的提问来源于stack exchange,提问作者jane1912
相关产品推荐
相关产品推荐

