shutil.copyfile()抛出Errno2错误:目标文件不存在的排查求助
问题排查与解决:FileNotFoundError 目标路径不存在
核心问题分析
从报错信息看,系统找不到目标文件路径/Users/fredericpepin/TwoWaysSyncNAS/Bloc/Malouin/Factures/2023/A-1-[1/2]-TxsMncpls2023.pdf,主要原因有两个:
- 目标父目录不存在:
sh.copyfile不会自动创建目标文件所在的目录,如果/Users/fredericpepin/TwoWaysSyncNAS/Bloc/Malouin/Factures/2023目录被删除、移动,或NAS挂载失效,就会触发该错误。 - 文件名包含非法字符:macOS(类Unix系统)不允许文件名包含
/字符,你的目标文件名A-1-[1/2]-TxsMncpls2023.pdf里的/会被系统解析为路径分隔符,实际会尝试创建A-1-[1]子目录下的2]-TxsMncpls2023.pdf,导致路径不存在。
解决步骤
步骤1:验证目标父目录状态
在终端执行以下命令,确认目录是否存在:
ls -ld /Users/fredericpepin/TwoWaysSyncNAS/Bloc/Malouin/Factures/2023
如果输出提示No such file or directory,说明目录确实不存在,需要手动创建或在代码中自动生成。
步骤2:修复代码(自动创建目录+处理非法字符)
修改代码,加入目录创建逻辑,并替换文件名中的非法/字符:
import os import shutil as sh year = 2023 FileNameList = ['A-1-[1/2]-TxsMncpls2023.pdf', 'A-1-[2/2]-TxsMncpls2023.pdf'] # 使用enumerate遍历,避免手动维护索引i for idx, src_path in enumerate(PathFile): # 替换文件名中的非法/字符 valid_filename = FileNameList[idx].replace('/', '-') dst_path = f'/Users/fredericpepin/TwoWaysSyncNAS/Bloc/Malouin/Factures/{year}/{valid_filename}' # 创建目标文件所在的所有父目录,exist_ok=True避免已存在时报错 os.makedirs(os.path.dirname(dst_path), exist_ok=True) # 执行复制 sh.copyfile(src_path, dst_path)
步骤3:检查NAS挂载状态
路径包含TwoWaysSyncNAS,推测是网络挂载的NAS设备。在macOS中,如果NAS挂载断开,原挂载路径会变成空目录或不可访问,需要重新挂载NAS确保路径有效。
额外注意点
- 权限设置
777只对已存在的文件/目录有效,目录不存在时权限设置无意义。 - 确保
PathFile和FileNameList的长度一致,否则会触发索引越界错误,使用enumerate遍历能更直观地对应两个列表的元素。
内容的提问来源于stack exchange,提问作者Frédéric Pepin
相关产品推荐
相关产品推荐

