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

如何用临时文件替代磁盘文件传递至仅支持路径的pybis API?

问题

我在Streamlit界面中通过以下代码获取上传的PDF文件:

import streamlit as st
uploaded_files = st.file_uploader(
        label="documents", type="pdf", accept_multiple_files=True
    )

下一步需要将这些文件传递至pybis API,但该API仅接受文件名称/路径作为输入,不支持BytesIO对象。当前我采用的可行方案是将文件保存到磁盘,传递路径后再删除文件,代码如下:

import os
import shutil
with open(file.name, "wb") as out_file:
    shutil.copyfileobj(file, out_file)
    dataset_new = openbis_object.new_dataset(
        files=[file.name]
    )
    dataset_new.save()
if os.path.isfile(file.name):
    os.remove(file.name)

我想了解是否有更优方案,比如创建临时文件并传递其路径来替代当前的磁盘文件存删操作。

更优方案:使用临时文件替代手动存删

直接用Python标准库的tempfile模块创建临时文件是更稳妥的方案,核心优势包括:

  • 临时文件会自动被系统清理,无需手动判断删除,避免因异常导致文件残留
  • 自动生成唯一文件名,不会和现有文件产生命名冲突
  • 可指定临时文件后缀为.pdf,贴合pybis API的文件类型预期

具体实现代码如下:

import tempfile
import shutil
import streamlit as st

uploaded_files = st.file_uploader(
    label="documents", type="pdf", accept_multiple_files=True
)

for file in uploaded_files:
    # 创建带.pdf后缀的临时文件,关闭后自动删除
    with tempfile.NamedTemporaryFile(suffix=".pdf", delete=True) as temp_file:
        # 复制上传文件内容到临时文件
        shutil.copyfileobj(file, temp_file)
        # 刷新缓冲区,确保内容完全写入磁盘
        temp_file.flush()
        
        # 传递临时文件路径给pybis API
        dataset_new = openbis_object.new_dataset(
            files=[temp_file.name]
        )
        dataset_new.save()

关键细节说明

  • NamedTemporaryFile(suffix=".pdf", delete=True):指定临时文件后缀,delete=True参数确保文件关闭后自动删除
  • temp_file.flush():强制将内存中的数据写入磁盘,避免pybis读取时文件内容不完整
  • 整个流程在with代码块内完成,即使API调用抛出异常,临时文件也会被自动清理,无需额外异常处理

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 08:10:01