如何逐行读取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
相关产品推荐
相关产品推荐

