[英]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: 我的问题是:
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)
表示目录,其中subdirs
和files
都是列表, 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.