python实现目录树生成示例


Posted in Python onMarch 28, 2014
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
import optparse
LOCATION_NONE     = 'NONE'
LOCATION_MID      = 'MID'
LOCATION_MID_GAP  = 'MID_GAP'
LOCATION_TAIL     = 'TAIL'
LOCATION_TAIL_GAP = 'TAIL_GAP'
Notations = {
    LOCATION_NONE: '',
    LOCATION_MID: '├─',
    LOCATION_MID_GAP: '│  ',
    LOCATION_TAIL: '└─',
    LOCATION_TAIL_GAP: '    '
}
class Node(object):
    def __init__(self, name, depth, parent=None, location=LOCATION_NONE):
        self.name = name
        self.depth = depth
        self.parent = parent
        self.location = location
        self.children = []
    def __str__(self):
        sections = [self.name]
        parent = self.has_parent()
        if parent:
            if self.is_tail():
                sections.insert(0, Notations[LOCATION_TAIL])
            else:
                sections.insert(0, Notations[LOCATION_MID])
            self.__insert_gaps(self, sections)
        return ''.join(sections)
    def __insert_gaps(self, node, sections):
        parent = node.has_parent()
        # parent exists and parent's parent is not the root node
        if parent and parent.has_parent():
            if parent.is_tail():
                sections.insert(0, Notations[LOCATION_TAIL_GAP])
            else:
                sections.insert(0, Notations[LOCATION_MID_GAP])
            self.__insert_gaps(parent, sections)
    def has_parent(self):
        return self.parent
    def has_children(self):
        return self.children
    def add_child(self, node):
        self.children.append(node)
    def is_tail(self):
        return self.location == LOCATION_TAIL
class Tree(object):
    def __init__(self):
        self.nodes = []
    def debug_print(self):
        for node in self.nodes:
            print(str(node) + '/')
    def write2file(self, filename):
        try:
            with open(filename, 'w') as fp:
                fp.writelines(str(node) + '/\n'
                              for node in self.nodes)
        except IOError as e:
            print(e)
            return 0
        return 1
    def build(self, path):
        self.__build(path, 0, None, LOCATION_NONE)
    def __build(self, path, depth, parent, location):
        if os.path.isdir(path):
            name = os.path.basename(path)
            node = Node(name, depth, parent, location)
            self.add_node(node)
            if parent:
                parent.add_child(node)
            entries = self.list_folder(path)
            end_index = len(entries) - 1
            for i, entry in enumerate(entries):
                childpath = os.path.join(path, entry)
                location = LOCATION_TAIL if i == end_index else LOCATION_MID
                self.__build(childpath, depth + 1, node, location)
    def list_folder(self, path):
        """Folders only."""
        return [d for d in os.listdir(path) if os.path.isdir(os.path.join(path, d))]
        # for entry in os.listdir(path):
        #     childpath = os.path.join(path, entry)
        #     if os.path.isdir(childpath):
        #         yield entry
    def add_node(self, node):
        self.nodes.append(node)
def _parse_args():
    parser = optparse.OptionParser()
    parser.add_option(
        '-p', '--path', dest='path', action='store', type='string',
        default='./', help='the path to generate the tree [default: %default]')
    parser.add_option(
        '-o', '--out', dest='file', action='store', type='string',
        help='the file to save the result [default: pathname.trees]')
    options, args = parser.parse_args()
    # positional arguments are ignored
    return options
def main():
    options = _parse_args()
    path = options.path
    if not os.path.isdir(path):
        print('%s is not a directory' % path)
        return 2
    if not path or path == './':
        filepath = os.path.realpath(__file__)  # for linux
        path = os.path.dirname(filepath)
    tree = Tree()
    tree.build(path)
    # tree.debug_print()
    if options.file:
        filename = options.file
    else:
        name = os.path.basename(path)
        filename = '%s.trees' % name
    return tree.write2file(filename)
if __name__ == '__main__':
    import sys
    sys.exit(main())

运行效果

gtest_start/
├─build/
├─lib/
│  └─gtest/
├─output/
│  ├─primer/
│  │  ├─Debug/
│  │  │  ├─lib/
│  │  │  └─obj/
│  │  └─Release/
│  │      ├─lib/
│  │      └─obj/
│  └─thoughts/
│      ├─Debug/
│      │  ├─lib/
│      │  └─obj/
│      └─Release/
│          ├─lib/
│          └─obj/
├─src/
│  ├─primer/
│  └─thoughts/
├─test/
│  ├─primer/
│  └─thoughts/
├─third_party/
│  └─gtest/
└─tools/
Python 相关文章推荐
使用python分析git log日志示例
Feb 27 Python
Python多线程编程简单介绍
Apr 13 Python
python anaconda 安装 环境变量 升级 以及特殊库安装的方法
Jun 21 Python
python实现定时提取实时日志程序
Jun 22 Python
详解Django中间件执行顺序
Jul 16 Python
python实现列表的排序方法分享
Jul 01 Python
在pytorch中为Module和Tensor指定GPU的例子
Aug 19 Python
关于Python核心框架tornado的异步协程的2种方法详解
Aug 28 Python
Python使用__new__()方法为对象分配内存及返回对象的引用示例
Sep 20 Python
opencv3/C++实现视频读取、视频写入
Dec 11 Python
Python如何测试stdout输出
Aug 10 Python
python爬取youtube视频的示例代码
Mar 03 Python
python改变日志(logging)存放位置的示例
Mar 27 #Python
使用python删除nginx缓存文件示例(python文件操作)
Mar 26 #Python
python实现ip查询示例
Mar 26 #Python
python fabric实现远程操作和部署示例
Mar 25 #Python
python基础教程之数字处理(math)模块详解
Mar 25 #Python
python操作摄像头截图实现远程监控的例子
Mar 25 #Python
python基础教程之字典操作详解
Mar 25 #Python
You might like
smtp邮件发送一例
2006/10/09 PHP
PHP header函数分析详解
2011/08/06 PHP
Smarty foreach控制循环次数的实现详解
2013/07/03 PHP
PHP函数getenv简介和使用实例
2014/05/12 PHP
PHP命令行脚本接收传入参数的三种方式
2014/08/20 PHP
关于php中一些字符串总结
2016/05/05 PHP
ThinkPHP中Widget扩展的两种写法及调用方法详解
2017/05/04 PHP
PHP实现广度优先搜索算法(BFS,Broad First Search)详解
2017/09/16 PHP
详解PHP实现支付宝小程序用户授权的工具类
2018/12/25 PHP
php实现微信公众号创建自定义菜单功能的实例代码
2019/06/11 PHP
仿中关村在线首页弹出式广告插件(jQuery版)
2012/05/03 Javascript
浅析return false的正确使用
2013/11/04 Javascript
在JavaScript中判断整型的N种方法示例介绍
2014/06/18 Javascript
js表头排序实现方法
2015/01/16 Javascript
js实现点击按钮后给Div图层设置随机背景颜色的方法
2015/05/06 Javascript
在JavaScript中如何解决用execCommand(
2015/10/19 Javascript
jQuery实现的仿百度分页足迹效果代码
2015/10/30 Javascript
ES6中如何使用Set和WeakSet
2016/03/10 Javascript
浅谈JavaScript异步编程
2017/01/20 Javascript
iconfont的三种使用方式详解
2018/08/05 Javascript
javascript中如何判断类型汇总
2019/05/14 Javascript
微信小程序实现音频文件播放进度的实例代码
2020/03/02 Javascript
在python里协程使用同步锁Lock的实例
2019/02/19 Python
Python 实现取多维数组第n维的前几位
2019/11/26 Python
TensorFlow keras卷积神经网络 添加L2正则化方式
2020/05/22 Python
python中封包建立过程实例
2021/02/18 Python
全球速卖通:AliExpress(国际版淘宝)
2017/09/20 全球购物
亚洲颇具影响力的男性在线购物零售商:His
2019/11/24 全球购物
致100米运动员广播稿
2014/02/14 职场文书
节约用水标语
2014/06/11 职场文书
暑假社会实践心得体会
2014/09/02 职场文书
税务干部群众路线教育实践活动自我剖析材料
2014/09/21 职场文书
工程部部长岗位职责
2015/02/12 职场文书
2015年五四青年节演讲稿
2015/03/18 职场文书
52条SQL语句教你性能优化
2021/05/25 MySQL
Nginx使用ngx_http_upstream_module实现负载均衡功能示例
2022/08/05 Servers