2017-04-14 79 views
0

我已经使用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 ':' ' '','“], ü '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

如果我理解正确的话,你有一个名为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', '') 
+0

太谢谢你了!你救了我从重写整个事情! – Coastie

相关问题