学习这个的需求来自于,我想把项目架构告诉gpt问问它,然后不太会打印项目架构 联想到Linux的tree指令
import os
class DirectoryTree:
def __init__(self, path):
self.path = path
def print_tree(self, method='default'):
if method == 'default':
self._print_dir_tree(self.path)
elif method == 'with_count':
self._print_dir_tree_with_count(self.path)
elif method == 'files_only':
self._print_files_only(self.path)
elif method == 'with_symbols':
self._print_dir_tree_with_symbols(self.path)
else:
print("Invalid method!")
def _print_dir_tree(self, path, indent=0):
print(' ' * indent + '|---' + os.path.basename(path))
for item in os.listdir(path):
itempath = os.path.join(path, item)
if os.path.isdir(itempath):
self._print_dir_tree(itempath, indent + 2)
else:
print(' ' * (indent + 2) + '|---' + item)
def _print_dir_tree_with_count(self, path, indent=0):
print(' ' * indent + '|---' + os.path.basename(path), end=' ')
items = os.listdir(path)
dirs = sum(1 for item in items if os.path.isdir(
os.path.join(path, item)))
files = len(items) - dirs
print(f"(dirs: {dirs}, files: {files})")
for item in items:
itempath = os.path.join(path, item)
if os.path.isdir(itempath):
self._print_dir_tree_with_count(itempath, indent + 2)
else:
print(' ' * (indent + 2) + '|---' + item)
def _print_files_only(self, path, indent=0):
for item in os.listdir(path):
itempath = os.path.join(path, item)
if os.path.isdir(itempath):
self._print_files_only(itempath, indent)
else:
print(' ' * indent + '|---' + item)
def _print_dir_tree_with_symbols(self, path, indent=0):
print(' ' * indent + ' ' + os.path.basename(path))
for item in os.listdir(path):
itempath = os.path.join(path, item)
if os.path.isdir(itempath):
self._print_dir_tree_with_symbols(itempath, indent + 2)
else:
print(' ' * indent + ' ' + item)
class EnhancedDirectoryTree:
def __init__(self, path):
self.path = path
self.show_hidden = False
self.depth_limit = None
self.show_files = True
self.show_dirs = True
def display_settings(self, show_hidden=False, depth_limit=None,
show_files=True, show_dirs=True):
self.show_hidden = show_hidden
self.depth_limit = depth_limit
self.show_files = show_files
self.show_dirs = show_dirs
def print_tree(self):
self._print_dir(self.path)
def _print_dir(self, path, indent=0, depth=0):
if self.depth_limit is not None and depth > self.depth_limit:
return
if self.show_dirs:
print(' ' * indent + ' ' + os.path.basename(path))
for item in sorted(os.listdir(path)):
# Check for hidden files/folders
if not self.show_hidden and item.startswith('.'):
continue
itempath = os.path.join(path, item)
if os.path.isdir(itempath):
self._print_dir(itempath, indent + 2, depth + 1)
else:
if self.show_files:
print(' ' * indent + ' ' + item)
# 创建类的实例
tree = DirectoryTree(os.getcwd())
# 使用默认方法打印
print("Default:")
tree.print_tree()
# 使用带计数的方法打印
print("\nWith Count:")
tree.print_tree(method='with_count')
# 使用只打印文件的方法
print("\nFiles Only:")
tree.print_tree(method='files_only')
# 使用emoji
print("\nWith Symbols:")
tree.print_tree(method='with_symbols')
print('================================================================')
enhancedtree = EnhancedDirectoryTree(os.getcwd())
# Default print
enhancedtree.print_tree()
print("\n---\n")
# Configure settings to show hidden files, but only up to depth 2 and only directories
enhancedtree.display_settings(show_hidden=True, depth_limit=2, show_files=False)
enhancedtree.print_tree()
print("\n---\n")
# Configure settings to show only files up to depth 1
enhancedtree.display_settings(show_files=True, show_dirs=False, depth_limit=1)
enhancedtree.print_tree()
os.getcwd()
: 返回当前工作目录的路径名。
os.path.basename(path)
: 返回路径名 path
的基本名称,即去掉路径中的目录部分,只保留文件或目录的名称部分。
os.listdir(path)
: 返回指定路径 path
下的所有文件和目录的名称列表。
os.path.isdir(path)
: 判断路径 path
是否为一个目录,如果是则返回 True
,否则返回 False
。
os.path.join(path, *paths)
: 将多个路径组合成一个完整的路径名。这个函数会自动根据操作系统的不同使用不同的路径分隔符。
上面两个类里面的函数其实就是用到递归,第二个类的那个函数可以设置递归深度