Python如何获取save_file函数生成的随机命名Excel文件名
问题根因
你当前代码无法获取文件路径的核心原因有两个:
- 随机文件名是直接内联写在
save_file()的调用参数里的,生成后没有赋值给变量持久留存,后续流程拿不到这个生成结果 - 后续读取文件时你在路径字符串里拼接的
save_file是自定义的函数对象,不是实际的文件路径,最终拼接出的是类似/app/workspace/<function save_file at 0x*>的无效路径,自然无法正确读取文件
另外原代码还有两个隐性bug:
sendFile = True,末尾多了逗号,会把布尔值变成元组(True,),属于不必要的语法问题- 写文件时没有主动关闭文件句柄,高并发场景下可能出现文件被占用、写入不完整的问题
修复方法
核心思路是提前生成唯一文件名,存入独立变量后全程复用,不要把文件名生成逻辑内联在函数调用参数里,同时可以优化save_file函数让它返回最终保存路径,方便调用。
修正后的可运行代码如下:
import random import pandas as pd from openpyxl import load_workbook # 如需彻底避免重名,可额外导入uuid:import uuid sendFile = False def save_file(excelFile, path): # 用上下文管理器写文件,自动关闭文件句柄 with open(path, 'wb') as f: f.write(excelFile.content) # 返回最终保存的路径 return path while sendFile == False: fileR = read_file("Excel file", button_text="Send") if "xlsx" in fileR.url: # 去掉末尾多余的逗号 sendFile = True else: display("Please, send an Excel File .xlsx", button_text="Back") # 提前生成唯一文件名,存入变量留存 # 原随机数方案,并发量高可替换为:file_suffix = uuid.uuid4().hex file_suffix = random.randint(1,99999) saved_path = f'/app/workspace/Sheet{file_suffix}.xlsx' # 执行文件保存 save_file(fileR, saved_path) # 后续所有Excel读写操作,统一复用saved_path变量即可 # pandas读文件 df = pd.read_excel(saved_path) # openpyxl加载工作簿 create_product = load_workbook(saved_path) # 后续写入请求ID、保存工作簿的逻辑无需改动,正常执行即可
优化建议
如果站点并发用户量较大,random.randint(1,99999)的取值范围只有10万,存在小概率生成重复后缀导致文件覆盖的风险,换成uuid生成的32位随机字符串可以彻底避免重名问题,替换方式只需要把生成后缀的代码改成:
import uuid file_suffix = uuid.uuid4().hex
其他逻辑完全不用改动。
内容的提问来源于stack exchange,提问作者LaraF
相关产品推荐
相关产品推荐

