Databricks使用openpyxl修改xlsx保存时报OSError 95如何解决
问题根因
触发OSError: [Errno 95] Operation not supported的核心原因是:Databricks的/dbfs FUSE挂载点不支持openpyxl保存文件时依赖的随机覆盖写、文件原子重命名类POSIX系统调用。读取操作仅需顺序读权限所以可以正常执行,写入操作直接落DBFS路径就会报这个错,和你写的单元格修改逻辑没有关系。
解决方法
不要直接将openpyxl处理后的文件保存到/dbfs开头的路径,采用「本地临时目录落盘+拷贝到目标路径」的两步法即可,全程不需要依赖pandas或DataFrame:
- 先把修改后的工作簿保存到集群节点本地的
/tmp临时目录,该目录是节点本地磁盘,完整支持标准文件操作 - 用Python标准库的文件拷贝方法,把临时目录下生成的xlsx文件复制到目标DBFS路径
可直接运行的参考代码:
import openpyxl from shutil import copyfile import os # 读取、修改文件的逻辑和原有代码完全一致 input_workbook1 = openpyxl.load_workbook('/dbfs/FileStore/Test/my_excel.xlsx') sheet_1 = input_workbook1.active sheet_1['A2'] = 'A2' # 先保存到本地临时路径 local_temp_save_path = "/tmp/Output.xlsx" input_workbook1.save(local_temp_save_path) # 拷贝临时文件到目标DBFS路径 target_dbfs_path = "/dbfs/FileStore/Test/Output.xlsx" copyfile(local_temp_save_path, target_dbfs_path) # 可选:清理本地临时文件释放空间 os.remove(local_temp_save_path)
避坑说明
- DBR 12及以上版本不要用
dbutils.fs.cp做本地到DBFS的拷贝,该方法默认走DBFS协议,识别本地路径需要额外加file:前缀,用Python标准库shutil.copyfile不需要处理路径前缀,兼容性更好 - 不要尝试调整openpyxl的写缓冲、写模式参数,这个报错是文件系统层面的能力缺失,修改库参数无法解决
- 如果目标路径是DBFS挂载的外部对象存储(S3、ADLS Gen2等),上述方法同样适用,不要直接调用
save()写入挂载路径即可
内容的提问来源于stack exchange,提问作者Chaitanya
相关产品推荐
相关产品推荐

