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简单进程锁代码实例
Apr 27 Python
Python的Django框架中settings文件的部署建议
May 30 Python
Python使用Scrapy保存控制台信息到文本解析
Dec 27 Python
centos6.8安装python3.7无法import _ssl的解决方法
Sep 17 Python
python绘制中国大陆人口热力图
Nov 07 Python
python通过txt文件批量安装依赖包的实现步骤
Aug 13 Python
softmax及python实现过程解析
Sep 30 Python
Django使用消息提示简单的弹出个对话框实例
Nov 15 Python
Python 装饰器原理、定义与用法详解
Dec 07 Python
借助Paramiko通过Python实现linux远程登陆及sftp的操作
Mar 16 Python
Python Opencv中用compareHist函数进行直方图比较对比图片
Apr 07 Python
完美解决jupyter由于无法import新包的问题
May 26 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/06/06 PHP
php获取301跳转URL简单实例
2013/12/16 PHP
php实现获取局域网所有用户的电脑IP和主机名、及mac地址完整实例
2014/07/18 PHP
PHP微信支付开发实例
2016/06/22 PHP
PHP实现的回溯算法示例
2017/08/15 PHP
Laravel 自动转换长整型雪花 ID 为字符串的实现
2020/10/27 PHP
Jquery Ajax学习实例6 向WebService发出请求,返回DataSet(XML) 异步调用
2010/03/18 Javascript
jquery选择器(常用选择器说明)
2010/09/28 Javascript
纯javascript实现的小游戏《Flappy Pig》实例
2015/07/27 Javascript
javascript巧用eval函数组装表单输入项为json对象的方法
2015/11/25 Javascript
javascript图片预加载完整实例
2015/12/10 Javascript
jQuery Validation PlugIn的使用方法详解
2015/12/18 Javascript
基于JQuery实现图片轮播效果(焦点图)
2016/02/02 Javascript
微信公众号开发 自定义菜单跳转页面并获取用户信息实例详解
2016/12/08 Javascript
jquery 正整数数字校验正则表达式
2017/01/10 Javascript
重新理解JavaScript的六种继承方式
2017/03/24 Javascript
Vue.js上传图片到阿里云OSS存储的方法示例
2018/12/13 Javascript
React倒计时功能实现代码——解耦通用
2020/09/18 Javascript
[10:18]2018DOTA2国际邀请赛寻真——找回自信的TNCPredator
2018/08/13 DOTA
python开发之IDEL(Python GUI)的使用方法图文详解
2015/11/12 Python
python的unittest测试类代码实例
2017/12/07 Python
Python将多个list合并为1个list的方法
2018/06/27 Python
Anaconda2 5.2.0安装使用图文教程
2018/09/19 Python
使用 Python 处理 JSON 格式的数据
2019/07/22 Python
Python 实用技巧之利用Shell通配符做字符串匹配
2019/08/23 Python
python中安装django模块的方法
2020/03/12 Python
Django多数据库配置及逆向生成model教程
2020/03/28 Python
python利用faker库批量生成测试数据
2020/10/15 Python
基于CSS3实现的黑色个性导航菜单效果
2015/09/14 HTML / CSS
财务出纳员岗位职责
2013/11/26 职场文书
煤矿班组长竞聘书
2014/03/31 职场文书
药剂专业求职信
2014/06/20 职场文书
委托培训协议书
2014/11/17 职场文书
农村党员干部承诺书
2015/05/04 职场文书
惊天动地观后感
2015/06/10 职场文书
初二数学教学反思
2016/02/17 职场文书