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

Python写入CSV文件报PermissionError [Errno 13]权限拒绝的解决方法

Python写入CSV报PermissionError [Errno 13] 修复方案

问题根因

报错和文件夹权限设置无关,是两个问题叠加导致:

  • 代码存在严重缩进错误:with open()上下文管理器的作用域仅包含拉取卡牌数据的一行代码,后续遍历卡牌、写入CSV的逻辑全部在with块外部。with块退出时会自动关闭文件句柄,块外操作已关闭的文件本身就会触发IO异常。
  • 脚本存放在OneDrive同步目录下(路径包含c:\Users\toril\OneDrive\),OneDrive进程会持续扫描、占用同步目录内的文件,当你尝试以写入模式打开CSV时,文件句柄被同步进程锁定,直接触发权限拒绝报错,即便手动关闭Excel中打开的CSV文件也无法解除该占用。

修复步骤

  1. 修正代码缩进与写入逻辑
    原错误缩进片段:
    with open ('pokemontest1.csv', 'w', newline='') as csv_file:
        # 只有这一行在with块内
        Cards = Card.where(q='set.name:generations supertype:pokemon')
    # 以下逻辑全部在with块外,执行时文件已被关闭
    for card in Cards:
        rows = [card.name, card.types, card.supertype, card.subtypes, card.number, card.rarity, card.nationalPokedexNumbers, card.id, card.set.name, card.set.series]
        
        csvwriter = csv.writer(csv_file)
        csvwriter.writerow(fields)
        csvwriter.writerows(rows)
    
    修复后可运行的完整代码(同步修正了表头不匹配、写入方法误用、中文乱码问题):
    from pokemontcgsdk import RestClient
    from pokemontcgsdk import Card
    import csv
    
    RestClient.configure('替换为你的实际API密钥')
    
    # 表头与实际写入字段一一对应
    fields = ['卡牌名称', '属性', '超级类型', '子类型', '编号', '稀有度', '全国图鉴编号', '卡牌ID', '所属卡包', '所属系列']
    
    # 所有文件相关操作全部放在with作用域内
    with open('pokemontest1.csv', 'w', newline='', encoding='utf-8-sig') as csv_file:
        csvwriter = csv.writer(csv_file)
        # 先写入表头
        csvwriter.writerow(fields)
        # 拉取目标卡牌数据
        cards = Card.where(q='set.name:generations supertype:pokemon')
        for card in cards:
            current_row = [
                card.name,
                card.types,
                card.supertype,
                card.subtypes,
                card.number,
                card.rarity,
                card.nationalPokedexNumbers,
                card.id,
                card.set.name,
                card.set.series
            ]
            # 单条数据用writerow写入,不要用writerows(该方法用于批量写入多行)
            csvwriter.writerow(current_row)
    
    小提示:原代码开头重复导入了RestClient,还导入了大量未使用的模块(Resource、capwords、Set、Type等),可以直接删除,减少不必要的加载开销。
  2. 解除文件占用
    两个方案选一个即可:
    • 把整个项目文件夹从OneDrive同步目录移到非同步的本地路径,比如D:\PokemonAI\,彻底避开同步进程锁文件的问题
    • 临时暂停OneDrive同步2小时,等脚本运行完成后再恢复同步
  3. 系统拦截排查
    如果前两步操作完还是报错,打开Windows Defender的勒索软件防护设置,检查是否开启了「受控文件夹访问」,如果开启就把当前使用的Python解释器程序加入允许列表,系统拦截写入也会抛出同样的权限错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 18:51:48