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

如何逐行读取FastAPI UploadFile中的文本内容

FastAPI 文件上传接口:正确读取文本行的实现方式

你遇到的问题是因为UploadFile.file返回的SpooledTemporaryFile对象和标准文件对象接口存在差异,无法直接用io.TextIOWrapper包装。下面提供两种合理的实现方式及说明:

方式一:异步逐行读取并解码(推荐)

利用FastAPI UploadFile自带的异步读取方法,贴合框架的异步设计,避免阻塞事件循环:

import io
from fastapi import APIRouter, UploadFile

router = APIRouter()

@router.post('/api/upload1')
async def post_a_file(file: UploadFile):    
    result = []
    # 异步读取字节行,解码为UTF-8文本
    while line := await file.readline():
        text_line = line.decode('utf-8')
        result.append(len(text_line))
    return result

方式二:转换为标准文件对象后用TextIOWrapper

通过rollover()强制SpooledTemporaryFile切换到磁盘文件模式,获得支持TextIOWrapper的标准文件对象:

import io
from fastapi import APIRouter, UploadFile

router = APIRouter()

@router.post('/api/upload1')
async def post_a_file(file: UploadFile):    
    result = []
    # 强制滚动到磁盘文件,获取标准文件接口
    file.file.rollover()
    # 用TextIOWrapper包装为文本文件对象
    with io.TextIOWrapper(file.file, encoding='utf-8') as f:
        for line in f:
            result.append(len(line))
    return result

关于字节行读取的合理性

你提到的读取字节行再解码的方式完全可靠:换行符(0x0A或0x0D0A)在所有常见字符集中的字节表示固定,不会出现在多字节字符的内部,因此按字节读取行不会截断字符,解码后能得到完整的文本行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 02:00:14