简体   繁体   English

目录的python n元树

[英]python n-ary tree for directories

I'm searching for an answer in python to represent an n-ary tree for directories. 我正在寻找python的答案,以表示目录的n元树。 I think an N-ary tree for folders is a good example. 我认为文件夹的N元树是一个很好的例子。 Here is my code: 这是我的代码:

class Node(object):
    def __init__(self, data):
        self.data = data
        self.children = []

n = Node(sys.argv[1])

def walktree(top): # recurse from "/top/"

    X = [] # clear record
    for f in os.listdir(top):
        pathname = os.path.join(top,f)
        mode = os.stat(pathname)[ST_MODE]
        if S_ISDIR(mode):  # It's a directory
            X.append(pathname)  #
            walktree(pathname)  # recursion
    X.sort()
    n.add_child(X)

MY QUESTION IS: 我的问题是:

  1. Is this code correct? 此代码正确吗?
  2. How to fill given Node of N-ary tree 如何填充N元树的给定节点
  3. How to traverse constructed N-ary tree 如何遍历构造的N元树

Answers to 1,2,3. 回答1,2,3。

def dirwalk(top): # build an n_ary tree 
    n = Node(top) # ONE Node per folder 
    for f in os.listdir(top): # loop over the current dir
        pathname = os.path.join(top,f) # dir + fname
        mode = os.stat(pathname)[ST_MODE]
        if S_ISDIR(mode):  # It's a directory
            ptr = dirwalk(pathname) # go down 
            n.add_child(ptr) # add pointer to node
    return n # return Node

def traverse(n): # traverse buildt tree
    for p in n:  # loop over children
        print p.data  
        traverse(p.children)

In my opinion, the pythonic way to do this would be to just use nested lists. 我认为,执行此操作的pythonic方法是仅使用嵌套列表。 You could represent a directory by the tuple (subdirs, files) where both subdirs and files are lists, subdirs containing further tuples, files being a list of filenames. 您可以用元组(subdirs, files)表示目录,其中subdirsfiles都是列表, subdirs包含更多的元组, files是文件名列表。

Example for construction, incorporating namedtuple as suggested by Niklas B: 构造示例,结合了Niklas B建议的namedtuple:

import os, os.path
from collections import namedtuple

Directory = namedtuple('Directory', ['path', 'subdirectories', 'files'])

def walktree(path):
    dirs = []
    files = []
    for f in os.listdir(path):
        if os.path.isdir(os.path.join(path, f)):
            dirs.append(walktree(os.path.join(path, f)))
        else:
            files.append(f)
    return Directory(path, dirs, files)

This should be fairly trivial to implement using os.walk : 使用os.walk实施起来应该很简单:

class Node():
    def __init__(self, name):
        self.name = name
        self.files = []
        self.folders = {} 
    def __str__(self):
        return '%s: files: %s, folders: %s' % (self.name, self.files, self.folders)

def find_node(top_node, name):
    import pdb; pdb.set_trace()
    result = top_node
    path = name.split(os.sep)[1:]
    for path_comp in path:
        result = result.folders[path_comp]

    return result

import sys, os
tree = Node(sys.argv[1])
for root, folders, files in os.walk(sys.argv[1]):
    parent_node = find_node(tree, root)

    for folder in folders:
        parent_node.folders[folder] = Node(folder)

    for file in files:
        parent_node.files.append(file)

print tree

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM