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

Python写入xlsm文件遇Errno 13权限拒绝,协方差矩阵写入失败求助

解决写入XLSM文件时的权限错误与数据写入问题

问题背景

我尝试用Python生成收缩后的协方差矩阵,再写入已有的XLSM文件,但操作失败,抛出权限错误:

[Errno 13] Permission denied: 'C:\Users\gm\AppData\Local\Continuum\anaconda3\Files for Python\Book2.xlsm'

生成协方差矩阵的代码可正常运行:

import numpy as np
from sklearn.covariance import LedoitWolf

real_cov = np.array([[.4, .2],[.2, .8]])
np.random.seed(0)
X = np.random.multivariate_normal(mean=[0, 0],cov=real_cov,size=50)
cov = LedoitWolf().fit(X)
shrunk_covariance = cov.covariance_
shrunk_covariance

但写入文件的代码报错:

import openpyxl
from openpyxl import load_workbook

wb = load_workbook(r"C:\Users\gm\AppData\Local\Continuum\anaconda3\Files for Python\Book2.xlsm", keep_vba = True)
ws = wb['Shrunk_CovLast']
ws.cell(row=1,column=1).value = print(shrunk_covariance)
wb.save(r"C:\Users\gm\AppData\Local\Continuum\anaconda3\Files for Python\Book2.xlsm")

错误原因分析

  1. 权限错误核心原因
    • 最常见的情况是目标XLSM文件正被Excel或其他程序占用,导致Python无法获取写入权限
    • 其次是当前用户对目标目录C:\Users\gm\AppData\Local\Continuum\anaconda3\Files for Python没有写入权限
  2. 代码逻辑错误
    • ws.cell(row=1,column=1).value = print(shrunk_covariance)这行代码逻辑错误:print()函数的返回值是None,实际是把None写入了单元格,而非协方差矩阵的内容。

分步解决方案

一、解决权限问题

  • 关闭占用文件的程序:先确认Excel已经完全关闭(包括后台进程),再重新运行代码
  • 检查目录权限:右键目标文件夹Files for Python,选择「属性」→「安全」→「编辑」,找到当前用户,勾选「写入」权限后保存
  • 临时测试路径:可以先把文件保存到桌面(比如r"C:\Users\gm\Desktop\Book2.xlsm"),如果能成功写入,说明原目录确实存在权限问题

二、修正数据写入代码

需要把协方差矩阵的每个元素逐个写入对应的单元格,下面是合并后的完整可运行代码:

import numpy as np
from sklearn.covariance import LedoitWolf
import openpyxl
from openpyxl import load_workbook

# 生成收缩协方差矩阵
real_cov = np.array([[.4, .2],[.2, .8]])
np.random.seed(0)
X = np.random.multivariate_normal(mean=[0, 0],cov=real_cov,size=50)
cov = LedoitWolf().fit(X)
shrunk_covariance = cov.covariance_

# 写入XLSM文件
try:
    # 加载工作簿,保留VBA宏
    wb = load_workbook(r"C:\Users\gm\AppData\Local\Continuum\anaconda3\Files for Python\Book2.xlsm", keep_vba=True)
    # 选择目标工作表
    ws = wb['Shrunk_CovLast']
    
    # 遍历矩阵,逐个写入单元格
    for row_idx, row_data in enumerate(shrunk_covariance, start=1):
        for col_idx, value in enumerate(row_data, start=1):
            ws.cell(row=row_idx, column=col_idx).value = value
    
    # 保存文件
    wb.save(r"C:\Users\gm\AppData\Local\Continuum\anaconda3\Files for Python\Book2.xlsm")
    print("协方差矩阵已成功写入文件!")
except PermissionError:
    print("权限错误:请确保文件未被其他程序占用,且当前用户有写入权限")
except Exception as e:
    print(f"发生其他错误:{str(e)}")

内容的提问来源于stack exchange,提问作者GM13

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:43:11