Python Shiny Express应用上传文件存储位置及自定义路径问题
Python Shiny Express 文件上传存储问题解答
1. 上传文件的默认存储位置
Shiny Express 默认会把上传的文件临时存储在系统临时目录:Linux/macOS 下是 /tmp,Windows 则是C:\Users\<用户名>\AppData\Local\Temp这类路径。这些临时文件会在会话结束后自动清理,且临时目录不在你的 Git 仓库范围内,所以你查看 Git 日志看不到变化。
2. 你的代码存在的问题
- 未判断用户是否上传文件:当用户还没选择文件时,
input.file1()返回None,直接访问file[0]["datapath"]会报错,这也是你说“调用 datapath 无返回内容”的原因之一。 - 未主动复制文件到自定义路径:Shiny 不会自动把临时文件转移到你指定的目录,你只是打开临时文件,没有执行写入自定义路径的操作,所以文件不会出现在
./data/results/下。
3. 修改文件存储位置的方法
要将上传文件保存到自定义目录,需要手动把临时文件复制到目标路径,步骤如下:
步骤1:确保目标目录存在
先检查并创建存储目录,避免因目录不存在导致写入失败。
步骤2:复制临时文件到自定义路径
在响应式函数中,判断用户已上传文件后,将临时文件复制到目标位置。
修正后的完整代码:
from shiny import reactive from shiny.express import input, render, ui from shiny.types import FileInfo from pathlib import Path import shutil # 初始化目标存储目录(不存在则创建) target_dir = Path(__file__).parent / "data/results" target_dir.mkdir(parents=True, exist_ok=True) ui.input_file("file1", "请选择要上传的文件", accept=['.csv'], multiple=False) @reactive.calc def parsed_file(): file: list[FileInfo] | None = input.file1() if not file: return None # 用户未上传文件时返回空值 # 获取临时文件路径与原始文件名 temp_file_path = file[0]["datapath"] original_name = file[0]["name"] save_path = target_dir / original_name # 复制临时文件到自定义目录 shutil.copy(temp_file_path, save_path) # 读取文件内容(按需执行) with open(save_path, "r", encoding="utf-8") as f: content = f.read() print(content) return content
4. 关键注意事项
datapath仅在用户成功上传文件后才有值,必须先判断input.file1()非空再访问。- 临时文件会被 Shiny 自动清理,务必在会话有效期内完成文件复制操作。
- 若需长期保留上传文件,必须手动复制到自定义目录,不要依赖临时文件路径。
内容的提问来源于stack exchange,提问作者makemyDNA
相关产品推荐
相关产品推荐

