You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 20:24:10