python实现目录树生成示例
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
import optparseLOCATION_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.parentdef has_children(self):
return self.childrendef add_child(self, node):
self.children.append(node)def is_tail(self):
return self.location == LOCATION_TAILclass 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 1def 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 entrydef 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 optionsdef main():
options = _parse_args()
path = options.path
if not os.path.isdir(path):
print('%s is not a directory' % path)
return 2if 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实现抓取网页生成Excel文件的方法示例
- Python实现将文本生成二维码的方法示例
- Python实现生成随机日期字符串的方法示例
- Python实现的双色球生成功能示例
- Python实现生成简单的Makefile文件代码示例
- Python实现生成简单的Makefile文件代码示例
- python 实现生成目录树及显示文件大小
- 生成目录结构算法的bash, perl和python实现
- Python实现导出数据生成excel报表的方法示例
- Python实现的生成格雷码功能示例
- Python实现随机生成有效手机号码及身份证功能示例
- Python实现查询某个目录下修改时间最新的文件示例
- Python实现的文本对比报告生成工具示例
- c#实例化继承类,必须对被继承类的程序集做引用 .net core Redis分布式缓存客户端实现逻辑分析及示例demo 数据库笔记之索引和事务 centos 7下安装python 3.6笔记 你大波哥~ C#开源框架(转载) JSON C# Class Generator ---由json字符串生成C#实体类的工具
- Python使用tablib生成excel文件的简单实现方法
- 普元 EOS Platform 7.6 从表主键生成策略采用:自动生成uuid,实现主从表增删改查示例demo
- Python使用tablib生成excel文件的简单实现方法
- Python实现的连接mssql数据库操作示例
- Python实现 zip解压缩到指定目录