具有相同键的多个值,读取为以“/”分隔的字符串的值,如何根据键分割值?

时间:2017-04-14 02:08:46

标签: python mysql xml sax defaultdict

我使用Python SAX解析了XML文件,并成功地将标记和值存储在字典中。我使用defaultdict来存储具有相同标记名称的一些嵌套标记的对。例如:

    <Actions>
    <Action sequenceNumber="1">
        <ActionCode/>
        <ActionDescription/>
    </Action>
    <Action sequenceNumber="2">
        <ActionCode/>
        <ActionDescription/>
    </Action>
    <Action sequenceNumber="3">
        <ActionCode/>
        <ActionDescription/>
    </Action>

所以输出就像这样,如果它们是空的:

  

defaultdict(,{u'ActionDescription':['','',''],   u'ActionCode':['','','']})

我需要将值插入MySQL,因此我将列名和值放在字符串中。

actionslist_insertstr = "INSERT INTO dbname.Actions ("
actionslist_valuesstr = "VALUES ('"

actionslist = handler.actions

for i, (k, v) in enumerate(actionslist.iteritems()):
    actionslist_insertstr += k
    actionslist_valuesstr += "/".join(v)
    if i < len(actionslist)-1:
        actionslist_insertstr += ","
        actionslist_valuesstr += "','"            
actionslist_insertstr += ")"
actionslist_valuesstr += "')" 
  

INSERT INTO dbname.Actions(ActionDescription,ActionCode)VALUES('/ /','/ /')

但我不希望将值存储为数据库中的一个字符串。如何使用分隔符将值拆分为行并根据列名存储它们?我试图拆分价值但是他们不再与他们的钥匙有关系了吗? 如果有人能给我一个如何解决这个问题的想法,我将非常感激。谢谢。

1 个答案:

答案 0 :(得分:0)

如果我理解正确,你有一个名为handler.actions的数据对象,现在这是一个defaultdict,带有项目:

{
    'ActionDescription': [' ', ' ', ' '],
    'ActionCode':        [' ', ' ', ' '],
}

因为您解析XML的方式。

这意味着handler.actions['ActionDescription'][0]sequenceNumber=1的说明,handler.actions['ActionCode'][0]sequenceNumber=1的代码。

XML文件中的行已经变成上面列表中的列。

如果我是对的,你有两个选择:

  1. 您可以更改解析XML的方式。我确信有一项功能可以让您为每个<Action>...</Action>项生成单独的词典。如果是这样,您可以按顺序处理它们。

  2. 您可以使用Python zip命令将两个(或更多)列表结合在一起。

  3. 代码:

    # Fake it with hard-coded data
    # actionslist = handler.actions
    actionslist = {
        'ActionDescription': [ 'd1', 'd2', ''],
        'ActionCode': ['', 'c2', 'c3'],
    }
    
    tablename = 'dbname.Actions'
    fieldnames = sorted(actionslist.keys())
    
    insert_fields = 'INSERT INTO {table_name} ({field_list})'.format(
        table_name=tablename,
        field_list=', '.join(fieldnames)
    )
    
    insert_values = insert_fields + ' VALUES({})'
    values = [actionslist[k] for k in fieldnames]
    
    for tpl in zip(*values):
        stmt = insert_values.format(', '.join(map(repr, tpl)))
        print(stmt)
    

    作为输出,我得到:

    INSERT INTO dbname.Actions (ActionCode, ActionDescription) VALUES('', 'd1')
    INSERT INTO dbname.Actions (ActionCode, ActionDescription) VALUES('c2', 'd2')
    INSERT INTO dbname.Actions (ActionCode, ActionDescription) VALUES('c3', '')