python实现获取当前目录下的树形结构
程序实现
在有些Linux上自带了tree命令来一树状结构显示一个目录,但是在有些linux上没有自带这个程序,所以这里用python写了一个小程序来实现这个功能,代码如下:
import osdef print_tree(folder_path, indent='', file_path=''):# 打印当前目录名称print(indent + os.path.basename(folder_path) + '/')# 写入文件with open(file_path, 'a') as f:f.write(indent + os.path.basename(folder_path) + '/' + '\n')# 获取子目录和文件列表subfolders = [f.path for f in os.scandir(folder_path) if f.is_dir()]files = [f.name for f in os.scandir(folder_path) if f.is_file()]# 递归打印子目录for i, subfolder in enumerate(sorted(subfolders)):# 判断是否为最后一个子目录if i == len(subfolders) - 1 and len(files) == 0:print_tree(subfolder, indent + ' ', file_path)else:print_tree(subfolder, indent + '│ ', file_path)# 打印文件for i, file in enumerate(sorted(files)):# 判断是否为最后一个文件if i == len(files) - 1:print(indent + '└── ' + file)with open(file_path, 'a') as f:f.write(indent + '└── ' + file + '\n')else:print(indent + '├── ' + file)with open(file_path, 'a') as f:f.write(indent + '├── ' + file + '\n')# 测试程序
folder_path = '/home/lihuanyu/code/03AdaBins'
tree_folder_path = folder_path + '/tree'
if not os.path.exists(tree_folder_path):os.mkdir(tree_folder_path)
file_path = tree_folder_path + '/tree.txt'
# 如果文件存在需要删除原有内容
if os.path.exists(file_path):os.remove(file_path)
with open(file_path, 'w') as f:print_tree(folder_path, file_path=file_path)
代码描述
-
首先导入
os
模块。 -
定义了一个名为
print_tree
的函数,接收三个参数:
folder_path
:要打印树形结构的目录路径。indent
:缩进字符串,用于控制打印出来的树形结构缩进深度。file_path
:要将树形结构写入到的文件路径,如果该参数为空,则不会将树形结构写入到文件中。
-
打印当前目录名称。使用
os.path.basename
函数获取当前目录的名称,并使用print
函数将其输出。 -
写入文件。使用
with open
将指定的文件以追加模式打开,并将当前目录的名称写入到文件中。 -
获取子目录和文件列表。使用
os.scandir
函数获取当前目录下所有子目录的路径和所有文件的名称,并分别保存到subfolders
和files
列表中。 -
递归打印子目录。遍历
subfolders
列表中的每个子目录,并使用递归调用print_tree
函数来打印该子目录的树形结构,并根据子目录在列表中的位置以及是否有文件决定缩进字 符串。 -
打印文件。遍历
files
列表中的每个文件,并使用print
函数打印该文件名,并根据文件在列表中的位置决定缩进字符串,并将文件名称写入到指定的文件中。 -
定义测试程序。首先指定要打印树形结构的目录路径
folder_path
。然后创建一个用于保存树形结构的文件夹tree_folder_path
和文件file_path
,并判断是否已存在该文件,如果存在则删除原有内容。最后使用with open
打开文件并调用print_tree
函数来输出并保存树形结构。