如何用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
相关产品推荐
相关产品推荐

