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中的装饰器使用
Jun 20 Python
Flask解决跨域的问题示例代码
Feb 12 Python
浅谈Python中的私有变量
Feb 28 Python
python如何通过实例方法名字调用方法
Mar 21 Python
python放大图片和画方格实现算法
Mar 30 Python
pandas.DataFrame选取/排除特定行的方法
Jul 03 Python
virtualenv 指定 python 解释器的版本方法
Oct 25 Python
Python os.rename() 重命名目录和文件的示例
Oct 25 Python
Python3实现爬取简书首页文章标题和文章链接的方法【测试可用】
Dec 11 Python
python中append实例用法总结
Jul 30 Python
python中matplotlib条件背景颜色的实现
Sep 02 Python
Python通过Manager方式实现多个无关联进程共享数据的实现
Nov 07 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
基于OpenCV的PHP图像人脸识别技术
2009/10/11 PHP
解析php中如何调用用户自定义函数
2013/08/06 PHP
使用 PHPStorm 开发 Laravel
2015/03/24 PHP
PHP Web木马扫描器代码分享
2015/09/06 PHP
PHP中抽象类、接口的区别与选择分析
2016/03/29 PHP
thinkPHP实现的省市区三级联动功能示例
2017/05/05 PHP
基于php+MySql实现学生信息管理系统实例
2020/08/04 PHP
Mootools 1.2教程 输入过滤第二部分(字符串)
2009/09/15 Javascript
js 替换功能函数,用正则表达式解决,js的全部替换
2010/12/08 Javascript
Jquery chosen动态设置值实例介绍
2013/08/08 Javascript
ExtJs纵坐标值重复问题的解决方法
2014/02/27 Javascript
jQuery html()方法使用不了无法显示内容的问题
2014/08/06 Javascript
node.js中的buffer.copy方法使用说明
2014/12/14 Javascript
javascript实现滑动解锁功能
2014/12/31 Javascript
jQuery简单自定义图片轮播插件及用法示例
2016/11/21 Javascript
Bootstrap基本组件学习笔记之面板(14)
2016/12/08 Javascript
JS实现可视化文件上传
2018/09/08 Javascript
微信小程序实现点赞、取消点赞功能
2018/11/02 Javascript
2019年度web前端面试题总结(主要为Vue面试题)
2020/01/12 Javascript
JavaScript浅层克隆与深度克隆示例详解
2020/09/01 Javascript
python使用arcpy.mapping模块批量出图
2017/03/06 Python
Python批量更改文件名的实现方法
2017/10/29 Python
Linux-ubuntu16.04 Python3.5配置OpenCV3.2的方法
2018/04/02 Python
transform python环境快速配置方法
2018/09/27 Python
浅谈Scrapy网络爬虫框架的工作原理和数据采集
2019/02/07 Python
python 基于opencv去除图片阴影
2021/01/26 Python
大女孩胸罩:Big Girls Bras
2016/12/15 全球购物
BIBLOO波兰:捷克的一家在线服装店
2018/03/09 全球购物
有趣的流行文化T恤、马克杯、手机壳和更多:Look Human
2019/01/07 全球购物
2014学校庆三八妇女节活动总结
2014/03/01 职场文书
党的群众路线教育实践活动公开承诺书
2014/03/28 职场文书
意外伤害赔偿协议书范本
2014/09/28 职场文书
教师节主题班会教案
2015/08/17 职场文书
未发现nvidia显卡怎么办?Win11系统中未检测到nvidia显卡解决教程
2022/04/08 数码科技
vue3 自定义图片放大器效果的示例代码
2022/07/23 Vue.js
Python  序列化反序列化和异常处理的问题小结
2022/12/24 Python