Mercurial > hg > config
view python/tree.py @ 390:9d02187611ae
make delimeters CLI switchable
author | Jeff Hammel <jhammel@mozilla.com> |
---|---|
date | Sat, 27 Jul 2013 20:09:49 -0700 |
parents | 5ae5ada91ac8 |
children |
line wrap: on
line source
#!/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) pre = [] directories = {} lvlndctr = [] last = {} passed_last = {} columns = [] lastdepth = depth indent = 0 for dirpath, dirnames, filenames in os.walk(directory, topdown=True): basename = os.path.basename(dirpath) parent = os.path.abspath(os.path.dirname(dirpath)) indent = depth(dirpath) - level dirnames[:] = sorted(dirnames, key=lambda x: x.lower()) last[os.path.abspath(dirpath)] = dirnames and dirnames[-1] or None directories[dirpath] = dirnames retval.append('%s%s%s' % ('│' * (indent-1), ('├' if basename == basename else '└') if indent else '', basename)) filenames = sorted(filenames, key=lambda x: x.lower()) retval.extend(['%s%s%s' % ('│' * (indent), '├' if (((index < len(filenames) -1)) or dirnames) else '└', name) for index, name in enumerate(filenames) ]) 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()