具有相同键的多个值,值读取为以'/'分隔的字符串,如何根据它们的键拆分值?

Multiple values with same key, values read as a string separated by '/', how to split the values according to their keys?

我已经使用 Python SAX 解析了 XML 文件 bu 并成功地将标签和值存储在字典中。我使用 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 (' / / ',' / / ')

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

如果我没理解错的话,你有一个名为 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 命令将两个(或更多)列表结合在一起。

代码:

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