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路径不存在
问题原因
- 路径写法前后不统一:写文件时用的是相对路径
app/raw_files,这个路径是相对于你运行脚本时的工作目录生成的;但读文件时硬编码了绝对路径/app/raw_files,指向的是系统根目录下的app文件夹,和你实际存文件的位置根本不是一个地方,当然提示不存在。 - 写CSV的目标目录
/app/clean_data没有提前创建,就算JSON读成功了,存CSV的时候也会报路径错。 - 代码没导入
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
相关产品推荐
相关产品推荐

