2017-04-14 8 views
0

나는 파이썬 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에 삽입해야하므로 문자열 이름과 값을 문자열에 넣어야합니다. 나는 값이 하나 저장되고 싶지 않아 dbname.Actions (ActionDescription, ActionCode) VALUES ('/ /', '/ /')

그러나 INTO

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 문자열을 데이터베이스에 저장합니다. 구분 기호를 사용하여 값을 행으로 분할하고 열 이름에 따라 값을 저장하려면 어떻게해야합니까? 값을 나누려고했지만 더 이상 키와 관계가 없습니까? 누군가가 나에게이 문제를 해결하는 방법을 줄 수 있다면 크게 감사하겠습니다. 고맙습니다. 만약 내가 제대로 이해하고

답변

0

, 당신은 handler.actions라는 데이터 객체를 가지고 있고,이 항목, 지금 defaultdict입니다 :

{ 
    'ActionDescription': [' ', ' ', ' '], 
    'ActionCode':  [' ', ' ', ' '], 
} 

때문에 당신이 XML을 구문 분석 한 방식.

즉, sequenceNumber=1에 대한 설명이고 handler.actions['ActionCode'][0]sequenceNumber=1의 코드입니다.

XML 파일의 행이 위의 목록에서 열로 바뀌 었습니다.

  1. 당신은 당신이 XML을 구문 분석하는 방식을 변경할 수 있습니다 : 내가 옳다 경우

    , 당신은 두 가지 선택이있다. 각 <Action>...</Action> 항목에 대해 별도의 사전을 생성 할 수있는 기능이있을 것입니다. 그렇다면 순서대로 처리 할 수 ​​있습니다.

  2. 파이썬 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