0

ディレクトリの n-ary ツリーを表すために、python で答えを探しています。フォルダの N 分木が良い例だと思います。これが私のコードです:

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)

私の質問は:

  1. このコードは正しいですか?
  2. N分木の特定のノードを埋める方法
  3. 構築された N 分木をトラバースする方法

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)
4

2 に答える 2

0

私の意見では、これを行うためのpythonicな方法は、ネストされたリストを使用することです。ディレクトリをタプルで表すことができます。(subdirs, files)ここで、subdirsfilesはリストであり、subdirsさらにタプルを含みfiles、ファイル名のリストです。

NiklasBによって提案された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)
于 2012-06-20T16:08:19.097 に答える
0

これは、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
于 2012-06-20T16:45:02.030 に答える