-1

可能重复:
在 Python 中创建树形目录列表

我想分析文件系统并将结果打印为格式化文件。我的第一个实现可以只是纯文本,但稍后我想合并 HTML。

我正在使用一种基本方法来收集每个文件夹中包含的文件,我可以将其返回并发送到文本处理器:

def gather_tree(source):
        tree = {}
        for path, dirs, files in os.walk(source):
            tree[path] = []
            for file in files:
                tree[path].append(file)
        return tree

显然,这里的问题是我正在生成一个没有深度概念的结构,我想我需要能够正确格式化具有足够空间和嵌套的列表。

我目前非常基本的打印模式如下所示:

def print_file_tree(tree):
    # Prepare tree
    dir_list = tree.keys()
    dir_list.sort()

    for directory in dir_list:
        print directory
        for f in tree[directory]:
            print f

我对数据结构很陌生,希望能提供一些意见!

4

1 回答 1

2

如果您计划从您的数据创建 XML,您实际上必须创建一个树状结构。这可以是您构建、注释并可能再次迭代或遍历的中间树,然后转换为ElementTree用于创建 XML 的中间树。或者您可以直接构造一个ElementTree使用lxml的 ElementTree API。

无论哪种方式,使用os.walk()都不是要走的路。这听起来可能违反直觉,但重点是:os.walk()为您序列化(展平)文件系统树,因此您可以轻松地对其进行迭代,而不必编写递归函数来执行此操作。但是,在您的情况下,您希望保留树结构,因此如果您自己编写该递归函数会容易得多。

这是一个如何构建ElementTreeusing的示例lxml

(此代码大致基于@MikeDeSimone对类似问题的回答)

import os
from lxml import etree


def dir_as_tree(path):
    """Recursive function that walks a directory and returns a tree
    of nested etree nodes.
    """
    basename = os.path.basename(path)
    node = etree.Element("node")
    node.attrib['name'] = basename
    # Gather some more information on this path here
    # and write it to attributes
    # ...
    if os.path.isdir(path):
        # Recurse
        node.tag = 'dir'
        for item in sorted(os.listdir(path)):
            item_path = os.path.join(path, item)
            child_node = dir_as_tree(item_path)
            node.append(child_node)
        return node
    else:
        node.tag = 'file'
        return node

# Create a tree of the current working directory
cwd = os.getcwd()
root = dir_as_tree(cwd)

# Create an element tree from the root node
# (in order to serialize it to a complete XML document)
tree = etree.ElementTree(root)

xml_document = etree.tostring(tree,
                              pretty_print=True,
                              xml_declaration=True,
                              encoding='utf-8')
print xml_document

示例输出:

<?xml version='1.0' encoding='utf-8'?>
<dir name="dirwalker">
  <dir name="top1">
    <file name="foobar.txt"/>
    <dir name="sub1"/>
  </dir>
  <dir name="top2">
    <dir name="sub2"/>
  </dir>
  <dir name="top3">
    <dir name="sub3">
      <dir name="sub_a"/>
      <dir name="sub_b"/>
    </dir>
  </dir>
  <file name="topfile1.txt"/>
  <file name="walker.py"/>
</dir>
于 2012-09-26T22:48:04.517 回答