Python : 디렉토리의 모든 내용을 재귀 적으로 나열하는 xml 파일을 프로그래밍 방식으로 생성

카 시어

내 디렉토리 구조는 다음과 같습니다. 다음 test은 디렉토리 ab. a그리고 b더 하위 디렉토리를 포함하고 a1, a2하고 b1, b2각각. 또한 a1이름이 text.

다음과 같이 ElementTree XML API사용하여이 구조에 대한 xml 파일을 만들었습니다 .

#!/usr/bin/env python3
import xml.etree.ElementTree as ET

test =  ET.Element('test')
a = ET.SubElement(test,'a')
a1 = ET.SubElement(a,'a1')
text = ET.SubElement(a1,'text')
a2 = ET.SubElement(a,'a2')
b = ET.SubElement(test,'b')
b1 = ET.SubElement(b,'b1')
b2 = ET.SubElement(b,'b2')
ET.dump(test)

위 프로그램의 출력은 다음과 같습니다.

<test>
    <a>
        <a1>
            <text />
        </a1>
        <a2 />
    </a>
    <b>
        <b1 />
        <b2 />
    </b>
</test>

그러나 주어진 디렉토리에 대해 프로그래밍 방식으로 xml을 생성해야합니다. 가능할까요?

히로 주인공

이것은 pathlib를 사용하는 재귀 시도입니다 .

from pathlib import Path
import xml.etree.ElementTree as ET

def xml_dir(pth, et_element=None):

    if et_element is None:
        et_element = ET.Element(pth.name)
    else:
        et_element = ET.SubElement(et_element, pth.name)

    for file in (fle for fle in pth.iterdir() if fle.is_file()):
        ET.SubElement(et_element, file.name)

    for directory in (fle for fle in pth.iterdir() if fle.is_dir()):
        xml_dir(directory, et_element)

    return et_element

ret = xml_dir(Path('/home/user/startdir/'))

이것은 ET.Element처음에 새로운 것을 만들고 ET.SubElement모든 하위 디렉토리에 s를 첨부 합니다.

추가로 파일과 디렉토리를 정렬 할 수 있습니다.


예쁘게 인쇄 된 xml 출력이 필요한 경우이 들여 쓰기 기능이 필요합니다 ( http://effbot.org/zone/element-lib.htm#prettyprint ).

def indent(elem, level=0):
    i = "\n" + level*"  "
    if len(elem):
        if not elem.text or not elem.text.strip():
            elem.text = i + "  "
        if not elem.tail or not elem.tail.strip():
            elem.tail = i
        for elem in elem:
            indent(elem, level+1)
        if not elem.tail or not elem.tail.strip():
            elem.tail = i
    else:
        if level and (not elem.tail or not elem.tail.strip()):
            elem.tail = i

이를 사용하면 요소 트리의 멋진 문자열 표현을 얻을 수 있습니다.

ret = xml_dir(Path('/home/user/startdir/'))
indent(ret)
ET.dump(ret)

또는 문자열을 변수에 저장하려는 경우 :

strg = ET.tostring(ret, method='xml').decode()

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관