【问题标题】:Multiple values with same key, values read as a string separated by '/', how to split the values according to their keys?具有相同键的多个值,读取为以'/'分隔的字符串的值,如何根据它们的键拆分值?
【发布时间】:2017-04-14 02:08:45
【问题描述】:

我已经使用 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('//','//')

但我不希望将这些值作为一个字符串存储在数据库中。我可以做些什么来将值拆分为行,使用分隔符并根据它们的列名存储它们?我试图拆分这些值,但是它们不再与它们的键有关系了? 如果有人能给我一个如何解决这个问题的想法,将不胜感激。谢谢。

【问题讨论】:

    标签: python mysql xml sax defaultdict


    【解决方案1】:

    如果我理解正确,您有一个名为 handler.actions 的数据对象,现在这是一个默认字典,其中包含项目:

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

    因为您解析 XML 的方式。

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

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

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

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

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

    代码:

    # 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', '')
    

    【讨论】:

    • 非常感谢!你让我免于重写整个事情!
    猜你喜欢
    • 2012-08-04
    • 1970-01-01
    • 1970-01-01
    • 2017-11-03
    • 1970-01-01
    • 1970-01-01
    • 2019-04-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多