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爬虫之打包生成exe文件
Nov 06 Python
Python实现基于HTTP文件传输实例
Nov 08 Python
在Python中操作字典之update()方法的使用
May 22 Python
Python解析最简单的验证码
Jan 07 Python
使用Python & Flask 实现RESTful Web API的实例
Sep 19 Python
python中scikit-learn机器代码实例
Aug 05 Python
Window 64位下python3.6.2环境搭建图文教程
Sep 19 Python
Django使用paginator插件实现翻页功能的实例
Oct 24 Python
python傅里叶变换FFT绘制频谱图
Jul 19 Python
pyenv与virtualenv安装实现python多版本多项目管理
Aug 17 Python
Python变量、数据类型、数据类型转换相关函数用法实例详解
Jan 09 Python
pytorch常见的Tensor类型详解
Jan 15 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
PHP数据过滤的方法
2013/10/30 PHP
php禁止浏览器使用缓存页面的方法
2014/11/07 PHP
摘自百度的图片轮换效果代码
2007/11/19 Javascript
JavaScript 事件记录使用说明
2009/10/20 Javascript
jquery怎样实现ajax联动框(一)
2013/03/08 Javascript
从jquery的过滤器.filter()方法想到的
2013/09/29 Javascript
如何动态的导入js文件具体该怎么实现
2014/01/14 Javascript
深入理解Javascript里的依赖注入
2014/03/19 Javascript
JS实现完全语义化的网页选项卡效果代码
2015/09/15 Javascript
正则表达式(语法篇推荐)
2016/06/24 Javascript
Bootstrap 手风琴菜单的实现代码
2017/01/20 Javascript
element-ui 时间选择器限制范围的实现(随动)
2019/01/09 Javascript
详解vue中v-model和v-bind绑定数据的异同
2020/08/10 Javascript
基于JS实现快速读取TXT文件
2020/08/25 Javascript
Django中使用group_by的方法
2015/05/26 Python
利用python实现数据分析
2017/01/11 Python
win10环境下python3.5安装步骤图文教程
2017/02/03 Python
python 全局变量的import机制介绍
2017/09/07 Python
PyQt5+requests实现车票查询工具
2019/01/21 Python
Python File(文件) 方法整理
2019/02/18 Python
python实现ip地址查询经纬度定位详解
2019/08/30 Python
python文件读写代码实例
2019/10/21 Python
Python wordcloud库安装方法总结
2020/12/31 Python
css3绘制百度的小度熊
2018/10/29 HTML / CSS
html5 worker 实例(一) 为什么测试不到效果
2013/06/24 HTML / CSS
美国奢侈品购物平台:Orchard Mile
2018/05/02 全球购物
css animation配合SVG制作能量流动效果
2021/03/24 HTML / CSS
教师年终个人自我评价
2013/10/04 职场文书
物流管理毕业生自荐信
2013/10/24 职场文书
教师开学感言
2014/02/14 职场文书
进口业务员岗位职责
2014/04/06 职场文书
餐饮商业计划书范文
2014/04/29 职场文书
车辆年审委托书范本
2014/09/18 职场文书
社区安全温馨提示语
2015/07/14 职场文书
oracle DGMGRL ORA-16603报错的解决方法(DG Broker)
2021/04/06 Oracle
Python进度条的使用
2021/05/17 Python