调用ShareFileClient类的create_file()方法时触发'__enter__'异常求助
嘿,我来帮你排查这个__enter__异常的问题!你遇到的这个报错,核心原因是create_file()方法返回的对象不支持Python的上下文管理器协议——简单说就是它没有实现__enter__和__exit__这两个方法,所以没法直接用with语句去包裹它执行。
先看你代码里的问题点:
with fileClient.create_file(size=1024**2) as countyDispFile: dataMartDF[export_cols].to_excel(countyDispFile, index=False)
这里你想用with来管理create_file()的返回值,但这个返回值并不是一个可以被上下文管理器接管的对象,Python找不到__enter__方法就直接报错了。
给你两个实用的解决办法,你可以按需选:
方法一:先创建空文件,再上传Excel字节流
这种方式更稳妥,先把DataFrame转成Excel的内存字节流,再上传到Azure文件共享:
from io import BytesIO # 1. 把DataFrame转成Excel格式,写入到内存字节流 output_stream = BytesIO() dataMartDF[export_cols].to_excel(output_stream, index=False) output_stream.seek(0) # 把流的指针移到开头,准备读取 # 2. 先在Azure文件共享创建空文件,再上传流 fileClient.create_file(size=0) # 空文件后续会自动适配上传内容的大小 fileClient.upload_file(output_stream)
这种方法避开了直接写入Azure流的兼容性问题,而且upload_file会自动处理文件大小,不用你提前预估1MB的限制,更灵活。
方法二:用open_file获取支持上下文管理器的流
如果你一定要用with语句的写法,可以用FileClient的open_file方法,指定二进制写入模式,它返回的对象是支持上下文管理器的:
from io import BytesIO # 先把Excel内容写到内存流 output_stream = BytesIO() dataMartDF[export_cols].to_excel(output_stream, index=False) output_stream.seek(0) # 用open_file获取可写的上下文管理器 with fileClient.open_file(mode='wb') as county_disp_file: county_disp_file.write(output_stream.getvalue())
这里要注意:别直接把to_excel的输出写到Azure的流里,因为to_excel需要的是标准的文件对象,而Azure的流是基于HTTP的远程流,直接写可能会有各种兼容性问题,先写到本地内存流是更稳妥的做法。
最后再提两个小建议:
- 检查下你的
azure-storage-file-share版本,旧版本的API和现在的用法可能不兼容,建议在requirements.txt里指定一个稳定的新版本,比如azure-storage-file-share>=12.17.0,然后重新安装依赖 - 之前你写的
size=1024**2是固定1MB,如果Excel文件超过这个大小,写入会直接失败,用上面的方法就不用纠结这个问题啦
试试上面的方案,应该能顺利解决这个异常~
备注:内容来源于stack exchange,提问作者anilcreates
相关产品推荐
相关产品推荐

