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

如何用numpy.frombuffer读取FastAPI接收的文本文件?

解决FastAPI接收文本文件并用Numpy解析为列数组的问题

你的问题核心是用错了Numpy的方法:np.frombuffer是用来解析二进制格式的字节数据(比如直接用Numpy保存的二进制文件),但你上传的是文本格式的数值文件(包含制表符、换行的字符型数值),字符的字节编码和二进制float的8字节存储完全不匹配,自然会出现缓冲区大小不匹配的错误——手动替换制表符/换行也没法解决,因为字符转成的字节不是二进制float的格式。

正确的做法是用Numpy专门处理文本数据的函数,步骤如下:

  1. 将读取到的字节数据解码为字符串(文本文件需指定编码,比如UTF-8)
  2. 把字符串包装成类文件对象,适配Numpy的文本读取接口
  3. 用np.loadtxt或np.genfromtxt读取文本内容,自动拆分列,再提取单独的列数组

修改后的完整代码:

import numpy as np
from fastapi import FastAPI, UploadFile
import io

app = FastAPI()

@app.post("/uploadfile/")
async def create_upload_file(file: UploadFile):
    # 读取字节并解码为文本字符串
    file_bytes = await file.read()
    text_content = file_bytes.decode("utf-8")
    
    # 将字符串转为类文件对象,供Numpy读取
    text_file = io.StringIO(text_content)
    
    # 读取文本数据,自动识别分隔符(制表符、空格、换行都支持)
    full_data = np.loadtxt(text_file)
    
    # 拆分三列为单独数组
    col1, col2, col3 = full_data[:, 0], full_data[:, 1], full_data[:, 2]
    
    # 示例返回,可根据需求调整
    return {
        "col1_sample": col1[:5].tolist(),
        "col2_sample": col2[:5].tolist(),
        "col3_sample": col3[:5].tolist(),
        "total_rows": len(full_data)
    }

额外说明:

  • 如果文本文件有表头行,改用np.genfromtxt并设置skip_header=1
  • 如果分隔符是固定制表符,可在loadtxt中指定delimiter="\t",提升解析准确性
  • np.loadtxt会自动忽略空行,处理更鲁棒

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 21:12:48