2012-02-05 42 views
2

我想讀一個目錄樹將它寫在一個XML文件,而無需太多sucess:與蟒蛇LXML一個XML文件中寫入一個目錄樹

# -*- coding: utf-8 -*- 
""" 
Created on Tue Jan 31 13:30:22 2012 

@author: Jean-Patrick Pommier 
""" 
import lxml.etree as et 
import os 
'''' 
Lire l'arboresence d'un répertoire projet 
        P 
       /| \ 
       A B C 
      /|\ |\ |\ 
       a b ca b c e 
Stocker dans un fichier xml 
<P> 
    <A> 
     <a> 
     <b> 
     <c> 
    </A> 
    <B> 
     <a> 
     <b> 
    </B> 
    <C> 
     <c> 
     <e> 
    </C> 
</P> 
''' 
def makeNodes(parentxml,leveldirlist): 
     #print 'parent',parentxml 
     print 'chidren',leveldirlist 
     for d in leveldirlist: 
      child=et.Element(d) 
      parentxml.append(child) 

if __name__ == '__main__': 
    topdir='/home/claire/Applications/ProjetPython/testxml/biblio' 
    projetxml=et.Element('Project')#racine  
    parent=projetxml 

    for roots, dirs, files in os.walk(topdir): 
     print roots#, '*',dirs, '*',files,'\n' 
     makeNodes(parent,dirs) 

    print(et.tostring(projetxml,pretty_print=True)) 

所有子目錄成爲「根的chidren」:

<Project> 
    <Roman/> 
    <Cuisine/> 
    <Essais/> 
    <Science/> 
    <r20s/> 
    <r19s/> 
    <Amerique/> 
    <France/> 
    <Asie/> 
    <Religion/> 
    <Politique/> 
    <maths/> 
    <physique/> 
</Project> 

在哪裏,法國阿美里克,應該是亞洲烹飪的傳統。

謝謝你的幫助。 讓 - 帕特里克

+0

正如一個音符,有效的文件夾名稱和有效的XML標籤名稱是不一樣的 - 「4」是一個有效的文件夾名稱,但XML標籤不能啓動用一個數字,標點或'xml'或空格開頭也是一樣。可能需要考慮。 – 2012-02-05 20:39:03

回答

3

你需要跟蹤父文件夾,並觀察你需要添加每個walked目錄的位置。

# -*- coding: utf-8 -*- 
import lxml.etree as et 
import os 
def makeNodes(current, parents, leveldirlist): 
    new = {} 
    for d in leveldirlist: 
     child=et.Element(d) 
     new[os.path.join(current, d)] = child 
     parents[current].append(child) 
    return new 

if __name__ == '__main__': 
    topdir='t1' 
    projectxml=et.Element('Project')  

    parents = {topdir: projectxml} 
    for current, dirs, files in os.walk(topdir): 
     parents.update(makeNodes(current, parents, dirs)) 

    print(et.tostring(projectxml,pretty_print=True)) 

這產生:

<Project> 
    <t2> 
    <t6/> 
    </t2> 
    <t3> 
    <t5/> 
    <t4> 
     <t7/> 
    </t4> 
    </t3> 
</Project> 
+0

謝謝!我會用你的代碼學習東西。 – 2012-02-05 20:56:45

+0

@讓 - 帕特不用擔心,如果你發現它解決了你的問題,隨時接受答案。 – 2012-02-05 21:01:59

+0

我通過topdir ='/ home/claire/Applications/ProjetPython/testlmx'替換topdir ='t1'時遇到消息錯誤: Traceback(最近調用最後一次): 文件「/ home/claire/Applications/ProjetPython /testlmx/correction-dirToxml.py「,第25行,在 parents.update(makeNodes(current,parents,dirs)) 文件」/home/claire/Applications/ProjetPython/testlmx/correction-dirToxml.py「,第16行,在makeNodes中 parents [current] .append(child) UnboundLocalError:在賦值之前引用的局部變量'child' – 2012-02-06 11:12:13