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

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'
问题排查

报错和代码逻辑存在以下几个问题:

  1. 核心报错原因:open()函数仅支持打开文件,代码中直接传入了文件夹路径/Excel、/CSV,无法对文件夹执行读写文件操作,因此触发权限类报错,和文件夹本身的读写权限无关。
  2. 冗余逻辑:已经通过openpyxl加载了Excel工作簿对象,不需要再额外以r+模式打开Excel源文件读取内容,这部分逻辑完全无效。
  3. 保存逻辑错误:保存CSV时没有拼接具体的输出文件名,即使路径正确,所有工作表的内容都会重复写入同一个路径,无法实现多工作表拆分生成独立CSV的需求,还会出现内容覆盖问题。
  4. 依赖缺失:代码中调用了csv.writer,但没有导入csv标准库模块,路径问题修复后也会触发NameError。
  5. 读取效率问题: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 01:04:07