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和MD5实现网站挂马检测程序
Mar 13 Python
Python入门篇之文件
Oct 20 Python
Python多进程分块读取超大文件的方法
Apr 13 Python
django框架如何集成celery进行开发
May 24 Python
Python将list中的string批量转化成int/float的方法
Jun 26 Python
Sanic框架蓝图用法实例分析
Jul 17 Python
Python操作mongodb数据库的方法详解
Dec 08 Python
基于Python实现ComicReaper漫画自动爬取脚本过程解析
Nov 11 Python
python实现简单飞行棋
Feb 06 Python
python如何通过闭包实现计算器的功能
Feb 22 Python
python和C++共享内存传输图像的示例
Oct 27 Python
python实现学生信息管理系统(面向对象)
Jun 05 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
海河写的 Discuz论坛帖子调用js的php代码
2007/08/23 PHP
PHP中static关键字原理的学习研究分析
2011/07/18 PHP
PHP利用header跳转失效的解决方法
2014/10/24 PHP
使用PHP uniqid函数生成唯一ID
2015/11/18 PHP
Yii框架防止sql注入,xss攻击与csrf攻击的方法
2016/10/18 PHP
PHP  Yii清理缓存的实现方法
2016/11/10 PHP
JS画5角星方法介绍
2013/09/17 Javascript
用jquery等比例控制图片宽高的具体实现
2014/01/28 Javascript
如何正确使用javascript 来进行我们的程序开发
2014/06/23 Javascript
JavaScript随机生成信用卡卡号的方法
2015/04/07 Javascript
纯js实现仿QQ邮箱弹出确认框
2015/04/29 Javascript
整理Javascript函数学习笔记
2015/12/01 Javascript
jquery遍历table的tr获取td的值实现方法
2016/05/19 Javascript
基于JavaScript实现购物网站商品放大镜效果
2016/09/06 Javascript
深入浅析Vue.js中 computed和methods不同机制
2018/03/22 Javascript
js中apply和Math.max()函数的问题及区别介绍
2018/03/27 Javascript
axios简单实现小程序延时loading指示
2018/07/30 Javascript
vue+elementUi 实现密码显示/隐藏+小图标变化功能
2020/01/18 Javascript
[09:23]国际邀请赛采访专栏:iG战队VK,Tongfu战队Cu
2013/08/05 DOTA
[49:59]KG vs Mineski 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
python使用nntp读取新闻组内容的方法
2015/05/08 Python
利用python实现简单的循环购物车功能示例代码
2017/07/05 Python
Python使用装饰器模拟用户登陆验证功能示例
2018/08/24 Python
如何通过50行Python代码获取公众号全部文章
2019/07/12 Python
python爬虫selenium和phantomJs使用方法解析
2019/08/08 Python
python实现输出一个序列的所有子序列示例
2019/11/18 Python
Python 支持向量机分类器的实现
2020/01/15 Python
Python基础之列表常见操作经典实例详解
2020/02/26 Python
德国箱包网上商店:koffer24.de
2016/07/27 全球购物
领先的荷兰线上超市:荷兰之家Holland at Home(支持中文)
2021/01/21 全球购物
入党申请人的自我鉴定
2013/12/01 职场文书
《棉鞋里的阳光》教学反思
2014/04/24 职场文书
检察机关个人对照检查材料
2014/09/15 职场文书
公司领导九九重阳节发言稿2014
2014/09/25 职场文书
《雷雨》教学反思
2016/02/20 职场文书
Redis延迟队列和分布式延迟队列的简答实现
2021/05/13 Redis