2017-04-14 27 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

相關問題