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 相关文章推荐
Mac下Supervisor进程监控管理工具的安装与配置
Dec 16 Python
使用Python的urllib和urllib2模块制作爬虫的实例教程
Jan 20 Python
Django在win10下的安装并创建工程
Nov 20 Python
python机器学习之神经网络(二)
Dec 20 Python
如何在python中实现随机选择
Nov 02 Python
Django生成PDF文档显示网页上以及PDF中文显示乱码的解决方法
Dec 17 Python
Python中求对数方法总结
Mar 10 Python
基于python实现地址和经纬度转换
May 19 Python
Python 解析xml文件的示例
Sep 29 Python
Pytorch如何切换 cpu和gpu的使用详解
Mar 01 Python
基于Python实现的购物商城管理系统
Apr 27 Python
利用Python实现Picgo图床工具
Nov 23 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
东方红 - 来复式再生机的修复
2021/03/02 无线电
MySQL相关说明
2007/01/15 PHP
让的PHP代码飞起来的40条小技巧(提升php效率)
2010/04/12 PHP
Laravel 5框架学习之模型、控制器、视图基础流程
2015/04/08 PHP
浅析php中array_map和array_walk的使用对比
2016/11/20 PHP
highchart数据源纵轴json内的值必须是int(详解)
2017/02/20 PHP
在 PHP 和 Laravel 中使用 Traits的方法
2019/11/13 PHP
JavaScript 学习笔记 Black.Caffeine 09.11.28
2009/11/30 Javascript
javascript 拖动表格行实现代码
2011/05/05 Javascript
js中数组Array的一些常用方法总结
2013/08/12 Javascript
js截取字符串的两种方法及区别详解
2013/11/05 Javascript
jQuery动态显示和隐藏datagrid中的某一列的方法
2013/12/11 Javascript
JavaScript返回当前会话cookie全部键值对照的方法
2015/04/03 Javascript
js面向对象的写法
2016/02/19 Javascript
基于javascript bootstrap实现生日日期联动选择
2016/04/07 Javascript
创建基于Bootstrap的下拉菜单的DropDownList的JQuery插件
2016/06/02 Javascript
JS实现星星评分功能实例代码(两种方法)
2016/06/09 Javascript
iOS和Android用同一个二维码实现跳转下载链接的方法
2016/09/28 Javascript
进阶之初探nodeJS
2017/01/24 NodeJs
vue脚手架vue-cli的学习使用教程
2017/06/06 Javascript
详解Vue.js组件可复用性的混合(mixin)方式和自定义指令
2017/09/06 Javascript
Angular4.0中引入laydate.js日期插件的方法教程
2017/12/25 Javascript
微信小程序 MinUI组件库系列之badge徽章组件示例
2018/08/20 Javascript
微信小程序实现单个卡片左滑显示按钮并防止上下滑动干扰功能
2019/12/06 Javascript
JavaScript实现横版菜单栏
2020/03/17 Javascript
vue.js实现照片放大功能
2020/06/23 Javascript
详解React 条件渲染
2020/07/08 Javascript
python版本的仿windows计划任务工具
2018/04/30 Python
Python函数和模块的使用总结
2019/05/20 Python
python中必要的名词解释
2019/11/20 Python
医院办公室主任职责
2013/12/29 职场文书
简历上的自我评价怎么写
2014/01/28 职场文书
实施意见格式范本
2015/06/05 职场文书
导游词之丹东鸭绿江
2019/10/24 职场文书
MyBatis 动态SQL全面详解
2021/10/05 MySQL
Netty分布式客户端接入流程初始化源码分析
2022/03/25 Java/Android