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

2024-09-28 22:31:05 发布

您现在位置:Python中文网/ 问答频道 /正文

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

但我不希望这些值作为一个字符串存储在数据库中。如何使用分隔符将值拆分为行,并根据它们的列名存储它们?我试着分割这些值,但是它们就不再和它们的键有关系了? 如果有人能告诉我如何解决这个问题,我将不胜感激。非常感谢。你知道吗


Tags: 字符串标记actionsactioninsertvaluesdbnameinto
1条回答
网友
1楼 · 发布于 2024-09-28 22:31:05

如果我理解正确,您有一个名为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^{}命令将两个(或更多)列表合并在一起。

代码:

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

相关问题 更多 >