Python读取Excel文件夹文件转CSV到另一文件夹报PermissionError解决方法
问题描述
本地存在Excel、CSV两个独立文件夹:
Excel文件夹存放文件名带_Updated前缀的Excel文件- 需求是将这类Excel文件转换为UTF-8编码的CSV文件
- 若Excel文件包含多个工作表,需按工作表拆分生成独立的CSV文件
运行代码时触发PermissionError报错,无法完成转换。
原问题代码
from pathlib import Path import openpyxl from openpyxl import load_workbook CSV_FILE_PATH='/Excel' CSV_FILE_SAVE='/CSV' for file in Path(CSV_FILE_PATH).glob('*_Updated.xlsx'): wb = load_workbook(file) print(file, wb.active.title) for sheetname in wb.sheetnames: with open(CSV_FILE_PATH, 'r+') as f_in, open(CSV_FILE_SAVE, 'w',encoding="utf-8") as f_out: content = f_in.read() spamwriter=csv.writer(f_out) for row in wb[sheetname].rows: spamwriter.writerow([cell.value for cell in row])
报错信息
PermissionError Traceback (most recent call last) <ipython-input-6-2ef7cc7706ca> in <module> 10 print(file, wb.active.title) 11 for sheetname in wb.sheetnames: ---> 12 with open(CSV_FILE_PATH, 'r+') as f_in, open(CSV_FILE_SAVE, 'w',encoding="utf-8") as f_out: 13 content = f_in.read() 14 spamwriter=csv.writer(f_out) PermissionError: [Errno 13] Permission denied: '/Excel'
问题排查
报错和代码逻辑存在以下几个问题:
- 核心报错原因:
open()函数仅支持打开文件,代码中直接传入了文件夹路径/Excel、/CSV,无法对文件夹执行读写文件操作,因此触发权限类报错,和文件夹本身的读写权限无关。 - 冗余逻辑:已经通过
openpyxl加载了Excel工作簿对象,不需要再额外以r+模式打开Excel源文件读取内容,这部分逻辑完全无效。 - 保存逻辑错误:保存CSV时没有拼接具体的输出文件名,即使路径正确,所有工作表的内容都会重复写入同一个路径,无法实现多工作表拆分生成独立CSV的需求,还会出现内容覆盖问题。
- 依赖缺失:代码中调用了
csv.writer,但没有导入csv标准库模块,路径问题修复后也会触发NameError。 - 读取效率问题:
load_workbook默认会加载单元格样式、公式等非必要内容,读取速度慢,且默认拿到的是公式对象而非计算后的值。
修正后代码
from pathlib import Path import openpyxl from openpyxl import load_workbook import csv # 注意根据自己的实际存储路径修改,Windows系统需写全盘符,比如r'C:\files\Excel' EXCEL_FOLDER = './Excel' CSV_OUTPUT_FOLDER = './CSV' for excel_file in Path(EXCEL_FOLDER).glob('*_Updated.xlsx'): # 加载工作簿,data_only=True直接读取单元格计算后的值,提升加载速度 wb = load_workbook(excel_file, data_only=True) print(f"处理文件:{excel_file.name},默认活动表:{wb.active.title}") for sheet_name in wb.sheetnames: ws = wb[sheet_name] # 拼接CSV输出路径:原Excel文件名_工作表名.csv,避免重名覆盖 output_file = Path(CSV_OUTPUT_FOLDER) / f"{excel_file.stem}_{sheet_name}.csv" # 写入时加newline=''是csv模块官方推荐写法,避免生成的CSV出现多余空行 with open(output_file, 'w', encoding='utf-8', newline='') as f: writer = csv.writer(f) for row in ws.iter_rows(values_only=True): writer.writerow(row) wb.close()
- 运行前确认
Excel和CSV两个文件夹真实存在,路径配置和实际存储位置一致即可正常运行。
内容的提问来源于stack exchange,提问作者biggboss2019
相关产品推荐
相关产品推荐

