Python报FileNotFoundError但对应目录已存在问题排查
报错信息
运行代码时触发如下FileNotFoundError:
Traceback (most recent call last): File "/home/ubuntu/new.py", line 57, in <module> transform_data_into_csv(n_files=20, filename='data.csv') File "/home/ubuntu/new.py", line 32, in transform_data_into_csv files = sorted(os.listdir(parent_folder), reverse=True) FileNotFoundError: [Errno 2] No such file or directory: 'app/raw_files'
运行场景截图:
问题根因
- 路径规则不统一:
getting_weather函数使用相对路径app/raw_files创建目录,transform_data_into_csv却使用带根路径前缀的绝对路径/app/raw_files,二者指向的文件系统位置完全不同,后者指向系统根目录下的app文件夹,并非脚本运行目录下的项目文件夹。 - 全局工作目录被修改:
getting_weather函数中执行os.chdir(filepath)将当前工作目录切换到了app/raw_files下,后续所有相对路径解析都会以该目录为起点,进一步加剧了路径定位错误。 - 存在其他隐藏bug:代码使用
pd.DataFrame但未导入pandas库;写入csv的目标目录app/clean_data未提前创建;json文件写入逻辑冗余,先转字符串再序列化容易出现格式解析错误。
修复后完整代码
import datetime import os import requests import json import pandas as pd def getting_weather(): api_key = 'XXX' cities = ['paris', 'london', 'washington'] # 以脚本自身所在目录为基准生成绝对路径,不受启动位置、工作目录切换影响 base_dir = os.path.dirname(os.path.abspath(__file__)) raw_file_dir = os.path.join(base_dir, 'app', 'raw_files') os.makedirs(raw_file_dir, mode=0o755, exist_ok=True) json_cities = [] # 文件名移到循环外,避免重复覆盖 filename = datetime.datetime.today().strftime('%Y-%m-%d %H:%M') + '.json' for city_name in cities: resp = requests.get( f'http://api.openweathermap.org/data/2.5/weather?q={city_name}&appid={api_key}' ) json_cities.append(resp.json()) save_path = os.path.join(raw_file_dir, filename) with open(save_path, 'w', encoding='utf-8') as f: json.dump(json_cities, f, ensure_ascii=False, indent=2) getting_weather() def transform_data_into_csv(n_files=None, filename='data.csv'): base_dir = os.path.dirname(os.path.abspath(__file__)) parent_folder = os.path.join(base_dir, 'app', 'raw_files') output_folder = os.path.join(base_dir, 'app', 'clean_data') # 提前创建输出目录 os.makedirs(output_folder, exist_ok=True) files = sorted(os.listdir(parent_folder), reverse=True) if n_files: files = files[:n_files] dfs = [] for f in files: # 过滤非json文件,避免读取异常 if not f.endswith('.json'): continue file_path = os.path.join(parent_folder, f) with open(file_path, 'r', encoding='utf-8') as f: data_temp = json.load(f) for data_city in data_temp: dfs.append( { 'temperature': data_city['main']['temp'], 'city': data_city['name'], 'pression': data_city['main']['pressure'], 'date': f.split('.')[0] } ) df = pd.DataFrame(dfs) print('\n', df.head(10)) df.to_csv(os.path.join(output_folder, filename), index=False, encoding='utf-8') transform_data_into_csv(n_files=20, filename='data.csv')
关键修改说明
- 移除了
os.chdir调用,避免修改全局工作目录导致路径解析混乱。 - 所有路径均以脚本所在目录为基准拼接为绝对路径,无论从哪个工作目录启动脚本,都能正确定位到项目内的文件夹。
- 补全了缺失的pandas导入,提前创建csv输出目录,解决后续会触发的连锁报错。
- 优化了json文件读写逻辑,直接存储结构化接口返回值,避免多余的字符串转换导致的格式错误。
- 增加了文件后缀过滤逻辑,避免读取目录下的无关文件触发解析错误。
内容的提问来源于stack exchange,提问作者Anastasia_data
相关产品推荐
相关产品推荐

