使用python lxml在xml文件中编写目录树

时间:2012-02-05 20:26:29

标签: python lxml os.walk

我正在尝试读取一个目录树,将其写入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))

所有子目录都成为“root's chidren”:

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

Amerique,法国,Asie应该是美食的子目录。

感谢您的帮助。 让 - 帕特里克

1 个答案:

答案 0 :(得分:3)

您需要跟踪父文件夹,并观察您需要添加每个步行目录的位置。

# -*- 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>