如何用临时文件替代磁盘文件传递至仅支持路径的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
相关产品推荐
相关产品推荐

