【问题标题】:Python nested dictionary with SQL insert带有 SQL 插入的 Python 嵌套字典
【发布时间】:2016-10-12 15:11:18
【问题描述】:

我在处理一个 XML 文件后生成了一个非常大的字典,我正在寻找从这个字典中提取的内容,并将列和值插入到我的 mySQL 数据库表中。

我正在使用 Python 3。

字典是嵌套的;这是我所拥有的一个简单示例:

d ={'Test1'{'TestID':'first','Dev_Type':'this device','Version':'v1_0','Address':'some Address'}
    'Test2'{'TestID':'second','Dev_Type':'that device','Version':'v1_0','Address':'other Address'}
    'Test3'{'TestID','third','Dev_Type':'other device','Version':'v1_0','Address':'another Address'}
} 

本质上,我想遍历该字典中的每个主键(例如 Test1、Test2、Test3)并将辅助键提取为列名元组,并将关联的辅助键值提取为值元组,有点像这样:

cols = ('TestID','Dev_Type','Version','Address')
vals = ('first','this device','v1_0','some Address')

在遍历每个主键时,我将使用以下命令将两个元组添加到我的 mySQL 表中:

sql = "INSERT INTO Parameters ({0}) VALUES ({1})".format(', '.join(cols), ', '.join(['%s'] * len(cols)));
try:
    cursor.execute(sql, vals)
except Exception as e:
    print(e)
    pass

然后在下一个主键('Test2')上重复该过程。

我已进行了初步尝试,但在此实例中对主键进行了硬编码:

for k, v in d:
    #Missing appropriate method here
    cols = tuple(d['Test1'].keys())
    vals = tuple(d['Test1'].values())

    sql = "INSERT INTO Parameters ({0}) VALUES ({1})".format(', '.join(cols), ', '.join(['%s'] * len(cols)));
    try:
        cursor.execute(sql, vals)
    except Exception as e:
        pass

connection.close()
return

【问题讨论】:

标签: python python-3.x dictionary


【解决方案1】:

您可以遍历d.values() 并使用嵌套字典上的.keys().values() 方法来获取列和值:

for v in d.values():
    cols = v.keys()
    vals = v.values()

    sql = "INSERT INTO Parameters ({}) VALUES ({})".format(
        ', '.join(cols),
        ', '.join(['%s'] * len(cols)));
    try:
        cursor.execute(sql, vals)
    except Exception as e:
        pass

请注意,在 Python 3 中,dict.keys()dict.values() 返回字典键和值的视图(与 Python 2 中的列表不同)。

【讨论】:

  • 是否可以保证v.values() 始终与键列表list(v) 的顺序相同?否则,您将在不匹配的列中插入错误的值
  • is 这样的保证d.keys()d.values()。不过没有提到list(d)
  • 是的,看起来更好
  • 您可以使用len(v) 而不是将cols 不必要地转换为列表。
  • 好电话。直到现在我才意识到 keysvalues 迭代器实际上定义了一个长度。感谢您指出这一点。
【解决方案2】:

遍历字典实际上是遍历键。 for k in d: 等价于 for k in d.keys():。您正在寻找 valuesitems 方法,它们实际上会将键和值作为元组返回:

for k, v in d.items():
    # k will take the values 'Test1', 'Test2', etc.
    # v will take the values of the corresponding nested dicts.

for v in d.values():
    # v will take on the values of the nested dicts.

我建议使用items 而不是values,因为这样您就可以参考正在处理的主键(测试)。我将在这里冒险并猜测您将需要它来用于您的程序的非平凡版本。

从那里开始,您使用 v,就像您尝试使用 d[...] 一样,因为它就是这样:

for k, v in d.items():
    cols = v.keys()
    vals = v.values()

    sql = "INSERT INTO Parameters ({0}) VALUES ({1})".format(
                ', '.join(cols),
                ', '.join(['%s'] * len(v))
    )

    try:
        cursor.execute(sql, vals)
    except Exception as e:
        pass

connection.close()
return

由于v 是一个嵌套字典,您可以像len(v) 一样获取colsvals 中的元素数量。

【讨论】:

    猜你喜欢
    • 2019-06-13
    • 1970-01-01
    • 1970-01-01
    • 2015-04-11
    • 2017-03-09
    • 1970-01-01
    • 2019-05-10
    • 1970-01-01
    • 2021-11-10
    相关资源
    最近更新 更多