读取目录中所有JSON文件时出现FileNotFoundError的问题排查
问题根源与解决方案
你的问题其实是个很常见的路径误区——os.listdir()返回的仅仅是目标目录里的文件名,不是完整的文件路径!
当你在循环里直接用open(file, 'r')时,Python会默认在当前脚本运行的工作目录下去找这个文件,而不是你指定的TripAdvisorHotels目录里,这就导致了FileNotFoundError。
而你单独打开文件能成功、遍历打印文件名也正常的原因是:
- 单独测试时,你要么是在
TripAdvisorHotels目录下运行的代码,要么是确保了该文件在当前工作目录中; os.listdir()只是读取目录里的文件名列表,不需要完整路径就能正常返回。
修复方案1:用os.path.join()拼接完整路径
这是最经典的处理方式,通过os.path.join()把目录路径和文件名拼接成完整路径,让open()能准确找到文件:
import os import json path_to_jsonfiles = 'TripAdvisorHotels' alldicts = [] for file in os.listdir(path_to_jsonfiles): # 拼接目录与文件名,生成完整路径 full_path = os.path.join(path_to_jsonfiles, file) with open(full_path, 'r') as fi: # 注意:别用dict当变量名,它是Python内置类型,会覆盖内置函数 hotel_dict = json.load(fi) alldicts.append(hotel_dict)
修复方案2:用pathlib(Python3.4+推荐)
pathlib是Python3.4引入的面向对象的路径处理模块,写法更简洁直观,还能自动处理跨平台路径问题:
from pathlib import Path import json path_to_jsonfiles = Path('TripAdvisorHotels') alldicts = [] # 遍历目录下的所有路径对象 for file_path in path_to_jsonfiles.iterdir(): # 先判断是不是文件,避免误处理子目录 if file_path.is_file(): with open(file_path, 'r') as fi: hotel_dict = json.load(fi) alldicts.append(hotel_dict)
这样修改后,循环就能正确读取所有JSON文件并追加到列表里了。
内容的提问来源于stack exchange,提问作者Lisadk
相关产品推荐
相关产品推荐

