2015-11-16 3 views
0

В следующей функции я хочу отображать элементы встроенного словаря в виде дерева XML и печатать его в файле.Python print to file as XML

def printToFile(self): 
     from lxml import etree as ET 
     for k,v in self.wordCount.items(): 
      root = ET.Element(k) 
      tree = ET.ElementTree(root) 
      for k1,v1 in v.items(): 
       DocID = ET.SubElement(root, 'DocID') 
       DocID.text = str(k1) 
       Occurences = ET.SubElement(root, 'Occurences') 
       Occurences.text = str(v1) 
      print ET.tostring(root, pretty_print=True, xml_declaration=False) 
      tree.write('output.xml', pretty_print=True, xml_declaration=False) 

Когда я запускаю код, все элементы отображаются на экране консоли, но проблема в том, что он печатает только последний элемент в файле.

В консоли, я получил это:

<weather> 
    <DocID>1</DocID> 
    <Occurences>1</Occurences> 
</weather> 

<london> 
    <DocID>1</DocID> 
    <Occurences>1</Occurences> 
    <DocID>2</DocID> 
    <Occurences>2</Occurences> 
    <DocID>3</DocID> 
    <Occurences>1</Occurences> 
</london> 

<expens> 
    <DocID>2</DocID> 
    <Occurences>1</Occurences> 
</expens> 

<nice> 
    <DocID>3</DocID> 
    <Occurences>1</Occurences> 
</nice> 

, но когда я открываю файл, я получил только это:

<nice> 
    <DocID>3</DocID> 
    <Occurences>1</Occurences> 
</nice> 

Может кто-то помочь мне решить эту проблему. Благодаря

+1

Вы воссоздание дерева каждый раз, когда вы цикл. –

+0

@MorganThrapp это не сработало – Nasser

+3

Вы переписываете файл output.xml каждый раз, когда вы зацикливаете цикл for. вместо этого вы должны добавить файл http://stackoverflow.com/questions/4706499/how-do-you-append-to-a-file-in-python – Woodsy

ответ

0

Основываясь на предыдущих комментариях, я изменил свою функцию следующим образом, и она работала:

def printToFile(self): 
     from lxml import etree as ET 
     with open('output.xml','a') as file: 
      for k,v in self.wordCount.items(): 
       root = ET.Element(k) 
       for k1,v1 in v.items(): 
        DocID = ET.SubElement(root, 'DocID') 
        DocID.text = str(k1) 
        Occurences = ET.SubElement(root, 'Occurences') 
        Occurences.text = str(v1) 
       //print ET.tostring(root, pretty_print=True, xml_declaration=False) 
       file.write(ET.tostring(root, pretty_print=True, xml_declaration=False))