基于Python實(shí)現(xiàn)優(yōu)雅的目錄結(jié)構(gòu)打印工具
在軟件開(kāi)發(fā)、系統(tǒng)管理和日常工作中,我們經(jīng)常需要查看和分析目錄結(jié)構(gòu)。
工具功能概述
這個(gè)DirectoryPrinter類提供了以下功能:
- 遞歸打印目錄結(jié)構(gòu)
- 可配置是否顯示隱藏文件
- 可設(shè)置最大遞歸深度
- 自定義縮進(jìn)和文件/文件夾符號(hào)
- 友好的交互式配置界面
核心代碼解析
初始化配置
def __init__(self, root_dir, show_hidden=False, depth=0, max_depth=None,
indent_symbol='│ ', folder_symbol='/ ', file_symbol='- '):
self.root_dir = root_dir
self.show_hidden = show_hidden
self.max_depth = max_depth
self.indent_symbol = indent_symbol
self.folder_symbol = folder_symbol
self.file_symbol = file_symbol
self.depth = depth
構(gòu)造函數(shù)接收多個(gè)參數(shù),允許用戶自定義打印行為。特別是indent_symbol、folder_symbol和file_symbol參數(shù),可以完全改變輸出樣式。
目錄打印邏輯
def print_directory(self):
try:
items = os.listdir(self.root_dir)
except FileNotFoundError:
print(f"指定的目錄 {self.root_dir} 不存在")
return
except PermissionError:
print(f"無(wú)法訪問(wèn)目錄 {self.root_dir}")
return
# 過(guò)濾隱藏文件
if not self.show_hidden:
items = [item for item in items if not (item.startswith('.') and os.path.isfile(os.path.join(self.root_dir, item)))]
方法首先嘗試列出目錄內(nèi)容,并處理可能出現(xiàn)的異常。然后根據(jù)配置過(guò)濾隱藏文件。
遞歸打印
for index, item in enumerate(sorted(items), start=1):
path = os.path.join(self.root_dir, item)
is_dir = os.path.isdir(path)
# 構(gòu)建前綴
prefix = self.indent_symbol * self.depth
if index == len(items):
if is_dir:
print(f"{prefix}└── {self.folder_symbol}{item}")
else:
print(f"{prefix}└── {self.file_symbol}{item}")
else:
if is_dir:
print(f"{prefix}├── {self.folder_symbol}{item}")
else:
print(f"{prefix}├── {self.file_symbol}{item}")
# 遞歸處理子目錄
if is_dir:
child_printer = DirectoryPrinter(
root_dir=path,
show_hidden=self.show_hidden,
depth=self.depth + 1,
max_depth=self.max_depth,
indent_symbol=self.indent_symbol,
folder_symbol=self.folder_symbol,
file_symbol=self.file_symbol
)
child_printer.print_directory()
這部分代碼實(shí)現(xiàn)了遞歸打印的核心邏輯,使用不同的符號(hào)區(qū)分文件和文件夾,以及區(qū)分是否是最后一項(xiàng)。
使用示例
通過(guò)交互式界面配置打印參數(shù):
def main():
root_directory = input("請(qǐng)輸入要打印的目錄路徑: ") or os.getcwd()
hide_hidden_files = input("是否隱藏隱藏文件? (y/n): ").lower() != 'y'
max_depth = input("請(qǐng)輸入最大遞歸深度 (留空表示無(wú)限制): ").strip() or None
auto_print = input("是否自動(dòng)打印目錄結(jié)構(gòu)? (y/n): ").lower() == 'y'
printer = DirectoryPrinter(
root_dir=root_directory,
show_hidden=hide_hidden_files,
max_depth=max_depth
)
printer.print_directory()
輸出效果
示例輸出可能如下:
├── / dir1
│ ├── - file1.txt
│ └── / subdir
│ └── - file2.txt
└── / dir2
├── - file3.txt
└── - file4.txt
完整代碼
import os
class DirectoryPrinter:
def __init__(self, root_dir, show_hidden=False, depth=0, max_depth=None, indent_symbol='│ ', folder_symbol='/ ', file_symbol='- '):
"""
初始化目錄打印器
:param root_dir: 指定要打印的目錄路徑
:param show_hidden: 是否打印隱藏文件和文件夾(默認(rèn)為 False)
:param depth: 當(dāng)前遞歸深度(內(nèi)部使用,用戶無(wú)需設(shè)置)
:param max_depth: 最大遞歸深度,None 表示無(wú)限制
:param indent_symbol: 縮進(jìn)符號(hào)
:param folder_symbol: 文件夾前綴符號(hào)
:param file_symbol: 文件前綴符號(hào)
"""
self.root_dir = root_dir
self.show_hidden = show_hidden
self.max_depth = max_depth
self.indent_symbol = indent_symbol
self.folder_symbol = folder_symbol
self.file_symbol = file_symbol
self.depth = depth
def print_directory(self):
"""
打印目錄結(jié)構(gòu)
"""
try:
items = os.listdir(self.root_dir)
except FileNotFoundError:
print(f"指定的目錄 {self.root_dir} 不存在")
return
except PermissionError:
print(f"無(wú)法訪問(wèn)目錄 {self.root_dir}")
return
# 過(guò)濾隱藏文件
if not self.show_hidden:
items = [item for item in items if not (item.startswith('.') and os.path.isfile(os.path.join(self.root_dir, item)))]
# 遞歸打印目錄和文件
for index, item in enumerate(sorted(items), start=1):
path = os.path.join(self.root_dir, item)
is_dir = os.path.isdir(path)
# 根據(jù)當(dāng)前深度和最大深度決定是否繼續(xù)遞歸
if self.max_depth is not None and self.depth > self.max_depth:
continue
# 構(gòu)建前綴
prefix = self.indent_symbol * self.depth
if index == len(items):
if is_dir:
print(f"{prefix}└── {self.folder_symbol}{item}")
else:
print(f"{prefix}└── {self.file_symbol}{item}")
else:
if is_dir:
print(f"{prefix}├── {self.folder_symbol}{item}")
else:
print(f"{prefix}├── {self.file_symbol}{item}")
# 遞歸處理子目錄
if is_dir:
child_printer = DirectoryPrinter(
root_dir=path,
show_hidden=self.show_hidden,
depth=self.depth + 1,
max_depth=self.max_depth,
indent_symbol=self.indent_symbol,
folder_symbol=self.folder_symbol,
file_symbol=self.file_symbol
)
child_printer.print_directory()
def main():
"""
主函數(shù),用戶配置入口
"""
# 配置參數(shù)
root_directory = input("請(qǐng)輸入要打印的目錄路徑: ") or os.getcwd() # 默認(rèn)為當(dāng)前目錄
hide_hidden_files = input("是否隱藏隱藏文件? (y/n): ").lower() != 'y'
max_depth = input("請(qǐng)輸入最大遞歸深度 (留空表示無(wú)限制): ").strip() or None # 無(wú)限制
auto_print = input("是否自動(dòng)打印目錄結(jié)構(gòu)? (y/n): ").lower() == 'y'
# 轉(zhuǎn)換為整數(shù)
try:
max_depth = int(max_depth) if max_depth else None
except ValueError:
print("最大遞歸深度必須為整數(shù)")
return
# 打印配置
print("\n=== 配置 ===")
print(f"根目錄: {root_directory}")
print(f"隱藏文件和文件夾: {'是' if hide_hidden_files else '否'}")
print(f"最大遞歸深度: {'無(wú)限制' if max_depth is None else max_depth}")
# 初始化打印器
printer = DirectoryPrinter(
root_dir=root_directory,
show_hidden=hide_hidden_files,
max_depth=max_depth
)
# 開(kāi)始打印
if auto_print:
print("\n=== 目錄結(jié)構(gòu) ===")
printer.print_directory()
else:
input("\n按下回車(chē)鍵開(kāi)始打印目錄結(jié)構(gòu)...")
print("\n=== 目錄結(jié)構(gòu) ===")
printer.print_directory()
# 程序主入口
if __name__ == "__main__":
main()
到此這篇關(guān)于基于Python實(shí)現(xiàn)優(yōu)雅的目錄結(jié)構(gòu)打印工具的文章就介紹到這了,更多相關(guān)Python打印目錄結(jié)構(gòu)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python輕松寫(xiě)個(gè)課堂隨機(jī)點(diǎn)名系統(tǒng)
現(xiàn)在的學(xué)生大部分都很積極,會(huì)主動(dòng)舉手回答問(wèn)題。但是,也會(huì)遇到一些不好的情況,比如年級(jí)越高主動(dòng)舉手的人越少,所以本文寫(xiě)了一個(gè)隨機(jī)的學(xué)生點(diǎn)名系統(tǒng)可以幫老師解決這些問(wèn)題2023-01-01
python轉(zhuǎn)換wrf輸出的數(shù)據(jù)為網(wǎng)頁(yè)可視化json格式
這篇文章主要介紹了python轉(zhuǎn)換wrf輸出的數(shù)據(jù)為網(wǎng)頁(yè)可視化json格式,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-09-09
Python實(shí)現(xiàn)計(jì)算信息熵的示例代碼
信息熵(information?entropy)是信息論的基本概念。描述信息源各可能事件發(fā)生的不確定性。本文將通過(guò)Python實(shí)現(xiàn)信息熵的計(jì)算,感興趣的可以了解一下2022-12-12
python3.3使用tkinter開(kāi)發(fā)猜數(shù)字游戲示例
這篇文章主要介紹了python3.3使用tkinter開(kāi)發(fā)猜數(shù)字游戲示例,需要的朋友可以參考下2014-03-03
基于Python開(kāi)發(fā)一個(gè)有趣的工作時(shí)長(zhǎng)計(jì)算器
隨著遠(yuǎn)程辦公和彈性工作制的興起,個(gè)人及團(tuán)隊(duì)對(duì)于工作時(shí)長(zhǎng)的準(zhǔn)確統(tǒng)計(jì)需求日益增長(zhǎng),本文將使用Python和PyQt5打造一個(gè)工作時(shí)長(zhǎng)計(jì)算器,感興趣的小伙伴可以了解下2025-06-06
python?matplotlib繪圖過(guò)程中設(shè)置線條顏色實(shí)戰(zhàn)舉例
Matplotlib是一個(gè)用于數(shù)據(jù)可視化和創(chuàng)建交互式圖表的Python庫(kù),下面這篇文章主要給大家介紹了關(guān)于python?matplotlib繪圖過(guò)程中設(shè)置線條顏色的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-05-05

