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

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)

关键细节说明

  1. tempfile.NamedTemporaryFile(delete=False):创建不自动删除的临时文件,确保我们能在with块外部访问它的路径;
  2. 保留原文件扩展名:让textract能正确识别文件类型,调用对应的处理逻辑;
  3. finally块:保证临时文件一定会被删除,防止磁盘资源泄漏。

这样修改后,不管上传.txt、.docx还是.pdf,textract都能正常处理了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:58:48