我使用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('/ /','/ /')
但我不希望将值存储为数据库中的一个字符串。如何使用分隔符将值拆分为行并根据列名存储它们?我试图拆分价值但是他们不再与他们的钥匙有关系了吗? 如果有人能给我一个如何解决这个问题的想法,我将非常感激。谢谢。
答案 0 :(得分:0)
如果我理解正确,你有一个名为handler.actions
的数据对象,现在这是一个defaultdict,带有项目:
{
'ActionDescription': [' ', ' ', ' '],
'ActionCode': [' ', ' ', ' '],
}
因为您解析XML的方式。
这意味着handler.actions['ActionDescription'][0]
是sequenceNumber=1
的说明,handler.actions['ActionCode'][0]
是sequenceNumber=1
的代码。
XML文件中的行已经变成上面列表中的列。
如果我是对的,你有两个选择:
您可以更改解析XML的方式。我确信有一项功能可以让您为每个<Action>...</Action>
项生成单独的词典。如果是这样,您可以按顺序处理它们。
您可以使用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', '')