如何从Python字典取值用于requests GET请求及CSV写入问题求助
问题分析与解决方案
一、原getCsv()函数的错误点
- 遍历字典
clusters时,for i in clusters得到的是字典的键(比如'cluster_1'),不是字典对象,调用i.values()会直接报错。 - 循环第一次就执行
return df,导致只会处理第一个集群,后续集群完全不会遍历。 - 每次循环都用
w模式覆盖input.csv,即使去掉return,最终也只会保留最后一个集群的数据;且写入文件再读取的操作完全多余,直接用pandas读取响应文本更高效。
二、输出CSV代码的错误点
- 文件打开模式用了
rb(二进制读)却要执行写操作,模式冲突,应该用'w'或'wt'(文本写模式)。 - 变量
i是getCsv()内部的循环变量,外部作用域根本不存在,调用i.keys会报错,且就算存在,也不是获取集群名的正确方式。 getCsv()只返回单个集群的DataFrame,没有收集所有集群的数据,也没有关联对应的集群名称。- 插入
cluster_name时,没有给每行数据赋值对应的集群键,语法和逻辑都错误。
三、修正后的完整代码
import requests import pandas as pd from datetime import datetime from io import StringIO clusters = { 'cluster_1':'https://cluster_1.something.com/api', 'cluster_2':'https://cluster_2.something.com/api' } # 替换为你的实际映射字典、请求头和参数 squads = {} headers = {} params = {} def get_all_cluster_data(): all_dfs = [] # 同时遍历集群名和对应API地址 for cluster_name, api_url in clusters.items(): r = requests.get(api_url, headers=headers, params=params) r.raise_for_status() # 主动抛出请求错误,方便排查问题 # 直接读取响应文本为DataFrame,跳过本地文件写入步骤 df = pd.read_csv(StringIO(r.text)) # 给当前集群的所有数据添加集群名字段 df['cluster_name'] = cluster_name all_dfs.append(df) # 合并所有集群的数据集 return pd.concat(all_dfs, ignore_index=True) def generate_output_csv(): timestamp = datetime.now() df = get_all_cluster_data() # 仅当目标列存在时才重命名 if 'Name' in df.columns and 'Total' in df.columns: df.rename(columns={"Name": "team", "Total": "cost"}, inplace=True) # 插入固定字段 df.insert(0, 'date', timestamp) df.insert(1, 'resource_type', "pod") df.insert(2, 'resource_name', "kubernetes") # 仅删除存在的列,避免KeyError drop_cols = ["CPU", "GPU", "RAM", "PV", "Network", "LoadBalancer", "External", "Shared", "Efficiency"] df.drop([col for col in drop_cols if col in df.columns], axis=1, inplace=True) # 映射team字段(确保team列存在) if 'team' in df.columns: df['team'] = df['team'].map(squads).fillna(df['team']) # 分组聚合并直接输出CSV grouped_df = df.groupby(["date","resource_type","resource_name","cluster_name","team"]).agg({"cost": sum}).reset_index() grouped_df.to_csv('output.csv', index=False) generate_output_csv()
关键修正说明
get_all_cluster_data():- 用
clusters.items()同时获取集群名和API地址,避免键值混淆。 - 用
StringIO直接解析响应文本为DataFrame,省去本地文件IO操作,提升效率。 - 给每个集群的数据集添加
cluster_name字段,确保数据与所属集群关联。 - 收集所有集群数据并合并,返回完整的数据集。
- 用
generate_output_csv():- 去掉手动打开文件的操作,直接用pandas的
to_csv方法输出,简化逻辑。 - 增加列存在性判断,避免因列不存在导致的报错。
- 确保
cluster_name字段正确关联到每条数据,分组聚合时能按集群维度统计。
- 去掉手动打开文件的操作,直接用pandas的
内容的提问来源于stack exchange,提问作者Aziz Zoaib
相关产品推荐
相关产品推荐

