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

Python写入规范JSON数据及读取路径报错问题解决

Python调用天气API获取数据及转CSV的问题修复

问题1:生成的JSON格式非法

问题原因

现有写法是手动把单个接口返回的字典转成字符串逐次追加到文件,完全没有遵循JSON语法规则,生成的文件属于非法格式:

  • 用str(r.json())得到的是Python字典的原生字符串表示,不是标准JSON序列化结果
  • 循环内用追加模式a每次只写一个字典字符串,既没有外层数组的方括号包裹,相邻字典之间也不会自动添加逗号分隔
  • 代码里调用os.chdir切换工作目录,后续如果脚本运行位置变了,读写路径很容易对不上

修复方案

不要手动拼接JSON字符串,收集完所有城市的天气数据后,用标准库json.dump一次性序列化写入整个列表,自动生成符合规范的JSON格式;移除os.chdir逻辑,所有路径通过拼接生成,避免工作目录切换带来的问题。
修正后的天气获取代码:

import datetime
import os
import requests
import json

def getting_weather():
    api_key = 'XXXXXXX'
    cities = ['paris', 'london', 'washington']

    # 统一用基于脚本位置的绝对路径,避免工作目录差异导致的路径问题
    base_dir = os.path.dirname(os.path.abspath(__file__))
    filepath = os.path.join(base_dir, 'app', 'raw_files')
    os.makedirs(filepath, mode=0o755, exist_ok=True)

    all_cities_weather = []
    filename = datetime.datetime.today().strftime('%Y-%m-%d %H:%M') + '.json'
    save_path = os.path.join(filepath, filename)

    for city_name in cities:
        resp = requests.get(
            'http://api.openweathermap.org/data/2.5/weather',
            params={'q': city_name, 'appid': api_key}
        )
        resp.raise_for_status() # 接口请求失败直接抛错,避免写入无效数据
        all_cities_weather.append(resp.json())

    # 一次性序列化写入标准JSON,自动处理逗号、数组格式
    with open(save_path, 'w', encoding='utf-8') as f:
        json.dump(all_cities_weather, f, indent=4, ensure_ascii=False)

getting_weather()

问题2:读取JSON时提示/app/raw_files路径不存在

问题原因

  1. 路径写法前后不统一:写文件时用的是相对路径app/raw_files,这个路径是相对于你运行脚本时的工作目录生成的;但读文件时硬编码了绝对路径/app/raw_files,指向的是系统根目录下的app文件夹,和你实际存文件的位置根本不是一个地方,当然提示不存在。
  2. 写CSV的目标目录/app/clean_data没有提前创建,就算JSON读成功了,存CSV的时候也会报路径错。
  3. 代码没导入pandas库,运行时会直接报名称错误。

修复方案

统一路径基准,全部用基于脚本位置的绝对路径,移除硬编码的根路径写法;提前创建CSV输出目录;补全必要的导入。
修正后的格式转换代码:

import os
import json
import pandas as pd

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, mode=0o755, exist_ok=True)

    files = sorted(os.listdir(parent_folder), reverse=True)
    if n_files:
        files = files[:n_files]

    dfs = []

    for f in files:
        file_path = os.path.join(parent_folder, f)
        # 跳过非json文件/子目录,避免读取报错
        if not os.path.isfile(file_path) or not f.endswith('.json'):
            continue
        with open(file_path, 'r', encoding='utf-8') as file:
            data_temp = json.load(file)
        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')

排查提示:如果调整后还是报路径错,可以在代码里加一句print(parent_folder)打印实际读取的路径,和你本地存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 19:48:22