You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 00:45:47