具有相同键的多个值,值读取为以'/'分隔的字符串,如何根据它们的键拆分值?
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 文件中的行已变成上面列表中的列。
如果我是对的,你有两个选择:
您可以更改解析 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', '')
我已经使用 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 文件中的行已变成上面列表中的列。
如果我是对的,你有两个选择:
您可以更改解析 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', '')