# HG changeset patch # User Jeff Hammel # Date 1374658707 25200 # Node ID 6e0853b16457dfc7ab21abe1ce92cf475d26b7d4 # Parent 8d4a0a2a5038995cae733558b4ed4990131cc0f2 initial tree prog diff -r 8d4a0a2a5038 -r 6e0853b16457 python/tree.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/python/tree.py Wed Jul 24 02:38:27 2013 -0700 @@ -0,0 +1,60 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +""" +tree in python +""" + +import optparse +import os +import sys + +here = os.path.dirname(os.path.realpath(__file__)) + +def depth(directory): + directory = os.path.abspath(directory) + level = 0 + while True: + directory, remainder = os.path.split(directory) + level += 1 + if not remainder: + break + return level + +def tree(directory): + retval = [] + level = depth(directory) + directories = {} + for dirpath, dirnames, filenames in os.walk(directory, topdown=True): + indent = depth(dirpath) - level + dirnames[:] = sorted(dirnames, key=lambda x: x.lower()) + directories[dirpath] = dirnames + retval.append('%s%s%s' % ('│' * (indent-1), + '├' if indent else '', + os.path.basename(dirpath))) + retval.extend(['%s%s%s' % ('│' * (indent), + '├' if index < len(filenames) -1 else '└', + name) + for index, name in + enumerate(sorted(filenames, key=lambda x: x.lower())) + ]) + return '\n'.join(retval) + +def main(args=sys.argv[1:]): + + usage = '%prog [options]' + parser = optparse.OptionParser(usage=usage, description=__doc__) + options, args = parser.parse_args(args) + if not args: + args = ['.'] + + not_directory = [arg for arg in args + if not os.path.isdir(arg)] + if not_directory: + parser.error("Not a directory: %s" % (', '.join(not_directory))) + + for arg in args: + print (tree(arg)) + +if __name__ == '__main__': + main()