Python使用w+模式写入文件报FileNotFoundError错误如何解决
问题成因
w+ 模式仅会自动创建不存在的目标文件,不会自动创建文件路径中不存在的上级目录。你代码里拼接得到的路径中C:\\Users\\Habib\\Documents\\Upwork_Projects\\Stephanie-web-scraping\\ufccrawler\\fighter这个fighter目录实际不存在,open()函数本身没有创建父目录的能力,因此无论切换a+/r+等任何模式都会触发该报错。
此外你原本手动用\\分割、拼接路径的写法仅适配Windows系统,在Linux/Mac环境下会因为路径分隔符不匹配出现逻辑错误。同时with上下文管理器会自动关闭文件,你写的f.close()属于冗余代码。
解决方法
在执行文件写入操作前,先判断目标文件的上级目录是否存在,不存在则手动创建即可,同时优化路径拼接逻辑避免跨平台兼容性问题:
方案1:基于os模块修改(兼容所有Python版本)
修改后代码如下:
page = response.url.split("&")[0][-1] # 页面URL结构示例:http://ufcstats.com/statistics/fighters?char=a&page=all filename = f'fighters-{page}.json' path = os.getcwd() # 向上跳两级目录替代手动分割路径 new_path = os.path.dirname(os.path.dirname(path)) # 用os.path.join拼接目录,自动适配系统路径分隔符 fighter_dir = os.path.join(new_path, "fighter") # 目录不存在则递归创建,exist_ok=True表示目录已存在时不抛出错误 os.makedirs(fighter_dir, exist_ok=True) completeName = os.path.join(fighter_dir, filename) with open(completeName, 'w+') as f: f.write(json.dumps(results, indent=2)) self.log(f'Saved file {completeName}')
方案2:基于pathlib修改(Python3.4+ 推荐,写法更简洁)
from pathlib import Path page = response.url.split("&")[0][-1] filename = f'fighters-{page}.json' # 链式获取目标目录,写法更直观 fighter_dir = Path.cwd().parent.parent / "fighter" # 递归创建目录 fighter_dir.mkdir(parents=True, exist_ok=True) completeName = fighter_dir / filename with open(completeName, 'w+') as f: f.write(json.dumps(results, indent=2)) self.log(f'Saved file {completeName}')
内容的提问来源于stack exchange,提问作者oyerohabib
相关产品推荐
相关产品推荐

