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

如何用Python的MySQL-Connector将MySQL表转为双键字典

解决Python读取MySQL数据并构建指定格式字典的问题

我来帮你修正这段代码,先梳理下原代码里的几个关键问题,再给出能实现你期望效果的方案:

原代码的问题点

  • 字典键语法错误:n[row["ID",c[0]] = ...的写法完全不符合Python字典的赋值规则,应该用**元组(row["ID"], c[0])**作为字典的键,同时要正确闭合括号。
  • 列值访问错误:columns中的每个元素c是游标描述对象,要获取列名得用c[0],所以访问行数据应该是row[c[0]],而非row[c]。
  • 方法调用遗漏括号:mycursor1.close只是引用了方法,没有实际执行关闭操作,必须写成mycursor1.close()。
  • 数据类型转换的矛盾:你代码里用了float(),但期望结果是保留1,5这类带逗号的格式——如果逗号是小数分隔符(比如欧洲地区的书写习惯),需要先替换逗号为点再转float;如果只是想保留原始字符串,就不需要这个转换。

修正后的代码

情况1:保留原始字符串格式(和你期望的结果完全匹配)

mycursor1 = conn.cursor(dictionary=True)
query1 = "SELECT * FROM `result`"
mycursor1.execute(query1)
# 直接提取所有列名,方便后续遍历
columns = [col[0] for col in mycursor1.description]
n = {}

for row in mycursor1:
    current_id = row["ID"]
    # 跳过ID列,只处理VSN、HSN这类目标列
    for col_name in columns:
        if col_name == "ID":
            continue
        n[(current_id, col_name)] = row[col_name]

mycursor1.close()  # 调用方法关闭游标

执行后,n的结构如下:

{(1, 'VSN'): '1,5', (1, 'HSN'): '1,8', (2, 'VSN'): '1,1', (2, 'HSN'): '2,1'}

你可以通过n[(1, 'VSN')]来获取对应值,和你期望的n[1,VSN]逻辑完全一致(Python中用元组作为字典键就是这样访问的)。

情况2:将逗号分隔的数值转为float类型

如果你的1,5实际代表小数1.5,需要转成数值类型,只需修改赋值部分:

n[(current_id, col_name)] = float(row[col_name].replace(',', '.'))

得到的结果会是:

{(1, 'VSN'): 1.5, (1, 'HSN'): 1.8, (2, 'VSN'): 1.1, (2, 'HSN'): 2.1}

额外说明

  • 你用conn.cursor(dictionary=True)让每行数据以字典形式返回的思路是对的,这能方便地通过列名取数。
  • Python里无法实现n[1,VSN]这种不带引号的列名写法(因为VSN不是变量),用字符串作为元组元素是最规范的实现方式,完全不影响使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:13:46