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文件也无法解除该占用。
修复步骤
- 修正代码缩进与写入逻辑
原错误缩进片段:
修复后可运行的完整代码(同步修正了表头不匹配、写入方法误用、中文乱码问题):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)
小提示:原代码开头重复导入了RestClient,还导入了大量未使用的模块(Resource、capwords、Set、Type等),可以直接删除,减少不必要的加载开销。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) - 解除文件占用
两个方案选一个即可:- 把整个项目文件夹从OneDrive同步目录移到非同步的本地路径,比如
D:\PokemonAI\,彻底避开同步进程锁文件的问题 - 临时暂停OneDrive同步2小时,等脚本运行完成后再恢复同步
- 把整个项目文件夹从OneDrive同步目录移到非同步的本地路径,比如
- 系统拦截排查
如果前两步操作完还是报错,打开Windows Defender的勒索软件防护设置,检查是否开启了「受控文件夹访问」,如果开启就把当前使用的Python解释器程序加入允许列表,系统拦截写入也会抛出同样的权限错误。
内容的提问来源于stack exchange,提问作者Tori Elstrom
相关产品推荐
相关产品推荐

