从MS-Access表创建Python字典

时间:2016-09-25 08:15:00

标签: python dictionary

我有一个包含6列的MS-Access表。我想提取第一列并将其用作键,然后提取第二列和第三列并将它们用作Python字典中的值。一个键有多个值。

这是我到目前为止所做的,但我无法弄清楚下一步该做什么:

import numpy
import pyodbc

access_database_file = r"C:\Users\david\Documents\\LISTS.mdb"
ODBC_CONN_STR = r"DRIVER={Microsoft Access Driver (*.mdb)};DBQ=%s;" % access_database_file

conn = pyodbc.connect(ODBC_CONN_STR)
cursor = conn.cursor()
cursor.execute("select * from LISTS")
print "..processing..."
rows = cursor.fetchall()

fieldDomains = {}

for row in rows:

    k = row[0]

    v1 = row[1]

    v2 = row[2]

    fieldDomains = {k: {v1: v2}}

    print fieldDomains

当我打印fieldDomains时,我得到了这个:

{u'MAIN_VW': {u'PRESSURE_ZONE_NUM': u'LU_PRESSURE_ZONE_VW'}}
{u'MAIN_VW': {u'DIAMETER': u'LU_MAIN_DIAMR_LK_MV'}}
{u'MAIN_VW': {u'MATERIAL': u'LU_MAIN_MATRL_LK_MV'}}
{u'WATER_VW': {u'SUBTYPE': u'LU_WATER_SUBTYP_LK_MV'}}
{u'WATER_VW': {u'IS_RESTRAINED': u'LU_YES_NO_LK'}}
{u'PIPE_VW': {u'IS_TIE_IN': u'LU_YES_NO_LK'}}
{u'PIPE_VW': {u'ORIGIN': u'LU_PIPE_ORIGN_LK_MV'}}

我想将这些单独的词典合并为一个大词典 - 但我不知道如何在我当前的脚本中执行此操作?这就是我想要的输出:

{u'MAIN_VW': {u'PRESSURE_ZONE_NUM': u'LU_PRESSURE_ZONE_VW', u'DIAMETER': u'LU_MAIN_DIAMR_LK_MV', u'MATERIAL': u'LU_MAIN_MATRL_LK_MV'}, u'WATER_VW': {u'SUBTYPE': u'LU_WATER_SUBTYP_LK_MV', u'IS_RESTRAINED': u'LU_YES_NO_LK', u'PIPE_VW': {u'IS_TIE_IN': u'LU_YES_NO_LK', u'ORIGIN': u'LU_PIPE_ORIGN_LK_MV'}}

1 个答案:

答案 0 :(得分:1)

您可以使用defaultdict来执行此操作

>>> from collections import defaultdict
>>> data = [{u'MAIN_VW': {u'PRESSURE_ZONE_NUM': u'LU_PRESSURE_ZONE_VW'}},
{u'MAIN_VW': {u'DIAMETER': u'LU_MAIN_DIAMR_LK_MV'}},
{u'MAIN_VW': {u'MATERIAL': u'LU_MAIN_MATRL_LK_MV'}},
{u'WATER_VW': {u'SUBTYPE': u'LU_WATER_SUBTYP_LK_MV'}},
{u'WATER_VW': {u'IS_RESTRAINED': u'LU_YES_NO_LK'}},
{u'PIPE_VW': {u'IS_TIE_IN': u'LU_YES_NO_LK'}},
{u'PIPE_VW': {u'ORIGIN': u'LU_PIPE_ORIGN_LK_MV'}}]
>>> output = defaultdict(dict)
>>> for item in data:
...     for k, v in item.items():
...         output[k].update(v)
>>> dict(output)
{'MAIN_VW': {'DIAMETER': 'LU_MAIN_DIAMR_LK_MV',
'MATERIAL': 'LU_MAIN_MATRL_LK_MV',
  'PRESSURE_ZONE_NUM': 'LU_PRESSURE_ZONE_VW'},
 'PIPE_VW': {'IS_TIE_IN': 'LU_YES_NO_LK', 'ORIGIN': 'LU_PIPE_ORIGN_LK_MV'},
 'WATER_VW': {'IS_RESTRAINED': 'LU_YES_NO_LK',
  'SUBTYPE': 'LU_WATER_SUBTYP_LK_MV'}}

更新

由于您正在以其他格式获取数据,例如data2,最好

>>> data2 = [[u'MAIN_VW', u'PRESSURE_ZONE_NUM', u'LU_PRESSURE_ZONE_VW'],
[u'MAIN_VW', u'DIAMETER', u'LU_MAIN_DIAMR_LK_MV'],
[u'MAIN_VW', u'MATERIAL', u'LU_MAIN_MATRL_LK_MV'],
[u'WATER_VW', u'SUBTYPE', u'LU_WATER_SUBTYP_LK_MV'],
[u'WATER_VW', u'IS_RESTRAINED', u'LU_YES_NO_LK'],
[u'PIPE_VW', u'IS_TIE_IN', u'LU_YES_NO_LK'],
[u'PIPE_VW', u'ORIGIN', u'LU_PIPE_ORIGN_LK_MV']]
>>> output2 = defaultdict(dict)
>>> for row in data2:
...     output2[row[0]].update({row[1]: row[2]})
>>> dict(output2)
{'MAIN_VW': {'DIAMETER': 'LU_MAIN_DIAMR_LK_MV',
  'MATERIAL': 'LU_MAIN_MATRL_LK_MV',
  'PRESSURE_ZONE_NUM': 'LU_PRESSURE_ZONE_VW'},
 'PIPE_VW': {'IS_TIE_IN': 'LU_YES_NO_LK', 'ORIGIN': 'LU_PIPE_ORIGN_LK_MV'},
 'WATER_VW': {'IS_RESTRAINED': 'LU_YES_NO_LK',
  'SUBTYPE': 'LU_WATER_SUBTYP_LK_MV'}}

所以基本上data2是你的rows = cursor.fetchall(),你可以用data2变量替换rows