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

如何从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()

关键修正说明

  1. get_all_cluster_data():

    • 用clusters.items()同时获取集群名和API地址,避免键值混淆。
    • 用StringIO直接解析响应文本为DataFrame,省去本地文件IO操作,提升效率。
    • 给每个集群的数据集添加cluster_name字段,确保数据与所属集群关联。
    • 收集所有集群数据并合并,返回完整的数据集。
  2. generate_output_csv():

    • 去掉手动打开文件的操作,直接用pandas的to_csv方法输出,简化逻辑。
    • 增加列存在性判断,避免因列不存在导致的报错。
    • 确保cluster_name字段正确关联到每条数据,分组聚合时能按集群维度统计。

内容的提问来源于stack exchange,提问作者Aziz Zoaib

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 00:01:07