Python开发Minecraft纹理随机化工具调用os.mkdir报FileExistsError如何解决
问题解决方法
报错直接原因
当前报错FileExistsError是因为你要创建的item1目录已经在对应路径下存在了,os.mkdir()只能创建不存在的目录,目标目录已存在时就会抛出这个错误。
解决方案步骤
1. 修复目录创建逻辑
两种方案可选:
- 方案一:创建前先判断目录是否存在,不存在再创建,也可以直接用
os.makedirs()加exist_ok=True参数,自动跳过已存在的目录 - 方案二:如果需要每次运行都用全新的空目录,可以先删除已存在的
item1目录再创建,非空目录需要用shutil.rmtree()删除
2. 修正代码里的其他隐藏问题
- 你代码里使用了
os模块的相关方法,但没有导入os模块,需要在代码开头加import os - 路径里混用正斜杠
/和反斜杠\,Windows下反斜杠会被当做转义字符,建议统一用原始字符串(路径前加r)避免转义问题 - 你两次调用
os.listdir()获取列表,虽然大部分情况没问题,但更稳妥的做法是只获取一次原文件列表,再打乱生成新列表 - 长路径重复写太冗余,可以提取成变量,减少出错概率
修正后的完整代码
import os import random import shutil def my_shuffle(arr): random.shuffle(arr) return arr # 统一提取路径变量,用原始字符串避免转义问题 base_dir = r"C:\Users\PC Specialist\Documents\Python Scripts\r\assets\minecraft\textures\item" new_dir = r"C:\Users\PC Specialist\Documents\Python Scripts\r\assets\minecraft\textures\item1" os.chdir(base_dir) oldTextures = os.listdir() # 直接打乱原列表的拷贝,避免两次调用os.listdir可能出现的不一致 newRandomizedTextures = my_shuffle(oldTextures.copy()) print(newRandomizedTextures) # 先判断新目录是否存在,存在就先删除旧的,再创建新的空目录 if os.path.exists(new_dir): shutil.rmtree(new_dir) os.mkdir(new_dir) # 用enumerate替代手动计数i,更简洁 for i, new_name in enumerate(newRandomizedTextures): old_file = os.path.join(base_dir, oldTextures[i]) temp_file = os.path.join(new_dir, oldTextures[i]) new_file = os.path.join(new_dir, new_name) shutil.copy(old_file, temp_file) os.rename(temp_file, new_file) # 后续你需要的替换原目录的逻辑可以直接加在这里 # shutil.rmtree(base_dir) # os.rename(new_dir, base_dir)
内容的提问来源于stack exchange,提问作者ElectricCreep444 EC444
相关产品推荐
相关产品推荐

