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 strip()函数 介绍
May 24 Python
python统计日志ip访问数的方法
Jul 06 Python
Python的面向对象编程方式学习笔记
Jul 12 Python
Python基于sftp及rsa密匙实现远程拷贝文件的方法
Sep 21 Python
Python错误: SyntaxError: Non-ASCII character解决办法
Jun 08 Python
python下10个简单实例代码
Nov 15 Python
python实现学生管理系统
Jan 11 Python
python脚本实现验证码识别
Jun 07 Python
python爬虫刷访问量 2019 7月
Aug 01 Python
python获取引用对象的个数方式
Dec 20 Python
django有外键关系的两张表如何相互查找
Feb 10 Python
详解python的内存分配机制
May 10 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
在PHP3中实现SESSION的功能(三)
2006/10/09 PHP
php 用sock技术发送邮件的函数
2007/07/21 PHP
json的键名为数字时的调用方式(示例代码)
2013/11/15 PHP
PHP在线书签系统分享
2016/01/04 PHP
Javascript 构造函数,公有,私有特权和静态成员定义方法
2009/11/30 Javascript
锋利的jQuery 要点归纳(三) jQuery中的事件和动画(下:动画篇)
2010/03/24 Javascript
你必须知道的Javascript知识点之"单线程事件驱动"的使用
2013/04/23 Javascript
jquery 循环显示div的示例代码
2013/10/18 Javascript
js浮点数保留两位小数点示例代码(四舍五入)
2013/12/26 Javascript
jQuery实现在下拉列表选择时获取json数据的方法
2015/04/16 Javascript
跟我学习javascript的Date对象
2015/11/19 Javascript
jQuery prototype冲突的2种解决方法(附demo示例下载)
2016/01/21 Javascript
webix+springmvc session超时跳转登录页面
2016/10/30 Javascript
JS获取本周周一,周末及获取任意时间的周一周末功能示例
2017/02/09 Javascript
关于jquery form表单序列化的注意事项详解
2017/08/01 jQuery
详解Puppeteer 入门教程
2018/05/09 Javascript
Koa从零搭建到Api实现项目的搭建方法
2019/07/30 Javascript
JavaScript交换变量的常用方法小结【4种方法】
2020/05/07 Javascript
详解JavaScript原型与原型链
2020/11/16 Javascript
[05:08]第一届“网鱼杯”DOTA2比赛精彩集锦
2014/09/05 DOTA
python动态加载变量示例分享
2014/02/17 Python
python实现的解析crontab配置文件代码
2014/06/30 Python
python持久性管理pickle模块详细介绍
2015/02/18 Python
简单实现python收发邮件功能
2018/01/05 Python
Django中template for如何使用方法
2021/01/31 Python
Europcar西班牙:全球汽车租赁领域的领导者
2018/09/17 全球购物
毕业生求职简历中的自我评价
2013/10/18 职场文书
高中教师考核方案
2014/05/18 职场文书
乡镇领导班子批评与自我批评材料
2014/09/23 职场文书
幼儿教师师德师风自我剖析材料
2014/09/29 职场文书
干部职工纪律作风整改措施思想汇报
2014/10/11 职场文书
安全隐患整改报告
2014/11/06 职场文书
党员示范岗材料
2014/12/19 职场文书
2015年物流客服工作总结
2015/07/27 职场文书
跟班学习心得体会(共6篇)
2016/01/23 职场文书
改进工作作风心得体会
2016/01/23 职场文书