Traceback (most recent call last): File "D:\py_project\数据源最终版.py", line 158, in <module> orig_wb.save(source_path) ~~~~~~~~~~~~^^^^^^^^^^^^^ File "D:\py_project\.venv\Lib\site-packages\openpyxl\workbook\workbook.py", line 386, in save save_workbook(self, filename) ~~~~~~~~~~~~~^^^^^^^^^^^^^^^^ File "D:\py_project\.venv\Lib\site-packages\openpyxl\writer\excel.py", line 291, in save_workbook archive = ZipFile(filename, 'w', ZIP_DEFLATED, allowZip64=True) File "D:\python\Lib\zipfile\__init__.py", line 1367, in __init__ self.fp = io.open(file, filemode) ~~~~~~~^^^^^^^^^^^^^^^^ PermissionError: [Errno 13] Permission denied: 'E:/niuxufeng/周报excle表数据汇总/本周工作/数据源.xlsx'
时间: 2025-05-26 20:50:56 AIGC 浏览: 49
### 解决方案分析
当使用 `openpyxl` 处理 Excel 文件时,如果目标文件未被关闭或者正被其他程序占用,则会触发 `PermissionError: [Errno 13] Permission denied` 错误。此错误表明当前进程无法获取对该文件的操作权限。
以下是针对该问题的解决方案:
#### 方法一:检测文件是否已被打开并提示用户手动关闭
可以通过尝试访问文件的方式来判断它是否正在被占用。如果文件不可访问,则可以向用户提供友好的提示信息[^4]。
```python
import os
def check_file_access(path):
try:
with open(path, 'r+b'):
pass
return True
except IOError:
return False
path = r'C:\Users\lk\Desktop\我的Excel.xlsx'
if not check_file_access(path):
raise Exception(f"文件 {path} 正在被占用,请先关闭后再运行脚本。")
else:
from openpyxl import Workbook
wb = Workbook()
ws = wb.active
ws['A1'] = "测试数据"
wb.save(path)
```
#### 方法二:捕获异常并提供反馈机制
通过 `try-except` 块来捕捉可能发生的 `PermissionError` 并给出相应的警告消息。
```python
from tkinter import messagebox
import traceback
def save_excel_with_error_handling():
path = r'C:\Users\lk\Desktop\我的Excel.xlsx'
try:
from openpyxl import Workbook
wb = Workbook()
ws = wb.active
ws['A1'] = "测试数据"
wb.save(path)
except PermissionError as e:
error_message = f"发生权限错误:{e}\n请确认文件 '{path}' 已经关闭。\n\n详细错误信息:\n{traceback.format_exc()}"
print(error_message)
messagebox.showerror("错误", error_message)
save_excel_with_error_handling()
```
#### 方法三:强制释放资源(不推荐)
虽然理论上可以借助第三方库如 `psutil` 来查找哪些进程占用了特定文件,并终止这些进程,但这通常不是一个安全的做法,因为可能会导致数据丢失或其他不稳定行为[^3]。
```python
import psutil
import os
def find_process_using_file(file_path):
file_in_use = []
for proc in psutil.process_iter(['pid', 'name']):
try:
flist = proc.open_files()
if flist:
for nt in flist:
if file_path.lower() == nt.path.lower():
file_in_use.append((proc.pid, proc.name))
except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess):
continue
return file_in_use
file_to_check = r'C:\Users\lk\Desktop\我的Excel.xlsx'
processes = find_process_using_file(file_to_check)
for pid, name in processes:
p = psutil.Process(pid)
print(f"结束进程 {name} ({pid})...")
p.terminate()
# 继续保存工作簿逻辑...
```
> **注意**: 上述方法存在风险,仅作为理论探讨,在实际应用中需谨慎评估后果。
---
### 总结
为了有效规避 `PermissionError: [Errno 13] Permission denied` 的问题,建议优先采用前两种方式——即提前验证文件状态或优雅地处理异常情况。这样既能保障用户体验又能维护系统的稳定性[^1][^2].
---
阅读全文
相关推荐


















