Python异步函数合并DataFrame时遇局部变量未赋值错误求助
Blob触发合并DataFrame的问题解决
问题场景与报错
我通过Blob触发处理两个Excel文件,尝试合并对应的DataFrame。为避免多线程跳行问题用了async让代码逐行执行,但执行pd.merge(Sach, Deb, how="outer")时出现错误:local variable 'Deb' referenced before assignment。
原代码如下:
async def main(myblob: func.InputStream, outputblob: func.Out[str]) -> None: if myblob.name.__contains__("Deb"): logging.info("Deb was found") Deb = read_excel_files("x", "Deb.xlsx") logging.info("Starting cleaning Process") ..... logging.info("Cleaning Deb is finished") if myblob.name.__contains__("Sach"): logging.info("Sach was found") Sach = read_excel_files("x", "Sach.xlsx") logging.info("Starting cleaning Process") ........ logging.info("Cleaning Sach is finished") Konten = pd.merge(Sach, Deb, how="outer") outputblob.set(Konten.to_string()) logging.info("Konten is uploaded")
我原本以为第一个if里定义的Deb变量能在第二个if里访问,还误以为执行Sach = read_excel_files("x", "Sach.xlsx")后,原本有值的Deb变成未赋值状态,想问是不是需要用.copy()?
问题原因
- 函数调用完全独立:Blob触发的函数每次都是全新的独立执行——触发Deb文件时,只会走第一个
if分支,处理完就结束;触发Sach文件时,只会走第二个if分支,这时候Deb根本没被定义过,自然报未赋值错误。两次触发是完全分开的运行实例,变量不会共享。 - 不存在Deb“消失”的情况:你觉得Deb变未赋值是误解,第二次触发Sach时,函数里从始至终都没定义过
Deb,和.copy()毫无关系,这个问题和DataFrame复制无关。
解决方案
方式一:处理Sach时主动读取已清洗的Deb
前提是Deb文件已经完成清洗并保存到了可访问的位置(比如Blob存储的固定路径):
async def main(myblob: func.InputStream, outputblob: func.Out[str]) -> None: # 处理Deb文件:清洗后保存到固定路径 if myblob.name.__contains__("Deb"): logging.info("Deb was found") Deb = read_excel_files("x", "Deb.xlsx") logging.info("Starting cleaning Process") # 补充Deb的清洗逻辑 ..... # 将清洗后的Deb保存到Blob存储的固定位置 save_cleaned_df(Deb, "cleaned_files/cleaned_Deb.xlsx") logging.info("Cleaning Deb is finished") # 处理Sach文件:读取已保存的Deb再合并 elif myblob.name.__contains__("Sach"): logging.info("Sach was found") Sach = read_excel_files("x", "Sach.xlsx") logging.info("Starting cleaning Process") # 补充Sach的清洗逻辑 ........ logging.info("Cleaning Sach is finished") # 读取之前保存的清洗后的Deb Deb = read_excel_files("cleaned_files", "cleaned_Deb.xlsx") Konten = pd.merge(Sach, Deb, how="outer") outputblob.set(Konten.to_string()) logging.info("Konten is uploaded")
方式二:等待两个文件都上传后再触发合并
可以配置Blob存储的事件触发规则,或者用一个监控逻辑,当检测到Deb和Sach两个文件都已上传完成后,再执行合并操作,避免单独触发其中一个文件时缺少另一个的情况。
内容的提问来源于stack exchange,提问作者Mostafa Bouzari
相关产品推荐
相关产品推荐

