2016-09-25 6 views
0

6つの列を持つMS-Accessテーブルがあります。私は最初の列を抽出し、それをキーとして使い、2列目と3列目を抽出し、Python辞書の値として使用したいと思います。 1つのキーには複数の値があります。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

あなたがするdefaultdictを使用することができ、あなたがdata2のように、別の形式でデータを取得しているので

>>> 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'}} 

UPDATE

それよりも良いです。

>>> 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'}} 

だから基本的にdata2rows = cursor.fetchall()で、data2rowsと置き換えることができます。

+0

私はPythonを初めて使っています。それはどのようにスクリプトに適用されますか? forループ内にこれを追加しますか? –

+1

@DavidBaileyこれをコードに適用するには、まず 'data'オブジェクトを次のように取得する必要があります。' data = [{row [0]:{row [1]:row [2]}} –

+1

@DavidBailey私は答えを更新しました.2番目の方法は、あなたが探している可能性が高いです –

関連する問題