Python 中如何直接读取表单上传的文件?

通过表单上传的文本 abc.txt 文件,然后可以直接读取吗?

file = open(form.file.data, 'r')

还是说需要先创建一个文件对象,再读取这个文件:

file = open(os.path.join(filepath, filename), 'r')

上传的文件如果可以直接从内存里读取,就避免了在本地创建一个文件对象的步骤了,是这样的吗?(直接从内存中读取,减少一次硬盘 io 的操作,降低读写出错的概率)


Python 中如何直接读取表单上传的文件?

6 回复

内存资源比硬盘资源贵


在Python中直接读取表单上传的文件,通常涉及Web框架。以Flask和FastAPI为例:

Flask示例:

from flask import Flask, request

app = Flask(__name__)

@app.route('/upload', methods=['POST'])
def upload_file():
    file = request.files['file_key']  # 'file_key'对应前端表单的name
    content = file.read()  # 直接读取为字节数据
    # 或使用 file.stream 进行流式读取
    return f"文件大小: {len(content)} bytes"

FastAPI示例:

from fastapi import FastAPI, File, UploadFile

app = FastAPI()

@app.post("/upload")
async def upload_file(file: UploadFile = File(...)):
    content = await file.read()
    return {"size": len(content)}

关键点:

  1. 通过框架的文件对象(如Flask的request.files、FastAPI的UploadFile)获取文件
  2. 使用.read()方法直接读取字节内容
  3. 大文件建议使用流式读取避免内存问题

总结:用框架的文件对象直接read就行。

表单上传的是 bytes,可以用 StringIO.StringIO 读取,剩下的和 file 类似。

但内存是无论如何必须用的,增加一次磁盘 io 的过程反而可能会增加内存占用的时间。当然如果是大文件必须放到磁盘处理的话另当别论。
读写出错的概率这个不用考虑,主要是考虑你现在服务的瓶颈在内存还是在磁盘 io。内存瓶颈那就流式写到磁盘流式处理,io 瓶颈那就尽可能在内存搞定。

不是很明白 如果数据要直接在内存操作 那为什么不直接进行数据 要传输文件,内存一般当作缓存,文件的功能是可复用

用 StringIO 是不是完了,还要等系统自动回收垃圾?用 file 直接 close()释放内存是不是更快一点?

回到顶部