Python實現優雅的目錄結構打印工具

Python實現優雅的目錄結構打印工具

在軟件開發、系統管理和日常工作中,我們經常需要查看和分析目錄結構。

工具功能概述

這個DirectoryPrinter類提供了以下功能:

  • 遞歸打印目錄結構
  • 可配置是否顯示隱藏文件
  • 可設置最大遞歸深度
  • 自定義縮進和文件/文件夾符號
  • 友好的交互式配置界面

核心代碼解析

初始化配置

def __init__(self, root_dir, show_hidden=False, depth=0, max_depth=None, indent_symbol='│   ', folder_symbol='/ ', file_symbol='- '):self.root_dir = root_dirself.show_hidden = show_hiddenself.max_depth = max_depthself.indent_symbol = indent_symbolself.folder_symbol = folder_symbolself.file_symbol = file_symbolself.depth = depth

構造函數接收多個參數,允許用戶自定義打印行為。特別是indent_symbolfolder_symbolfile_symbol參數,可以完全改變輸出樣式。

目錄打印邏輯

def print_directory(self):try:items = os.listdir(self.root_dir)except FileNotFoundError:print(f"指定的目錄 {self.root_dir} 不存在")returnexcept PermissionError:print(f"無法訪問目錄 {self.root_dir}")return# 過濾隱藏文件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)# 構建前綴prefix = self.indent_symbol * self.depthif 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():root_directory = input("請輸入要打印的目錄路徑: ") or os.getcwd()hide_hidden_files = input("是否隱藏隱藏文件? (y/n): ").lower() != 'y'max_depth = input("請輸入最大遞歸深度 (留空表示無限制): ").strip() or Noneauto_print = input("是否自動打印目錄結構? (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 osclass 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: 是否打印隱藏文件和文件夾(默認為 False):param depth: 當前遞歸深度(內部使用,用戶無需設置):param max_depth: 最大遞歸深度,None 表示無限制:param indent_symbol: 縮進符號:param folder_symbol: 文件夾前綴符號:param file_symbol: 文件前綴符號"""self.root_dir = root_dirself.show_hidden = show_hiddenself.max_depth = max_depthself.indent_symbol = indent_symbolself.folder_symbol = folder_symbolself.file_symbol = file_symbolself.depth = depthdef print_directory(self):"""打印目錄結構"""try:items = os.listdir(self.root_dir)except FileNotFoundError:print(f"指定的目錄 {self.root_dir} 不存在")returnexcept PermissionError:print(f"無法訪問目錄 {self.root_dir}")return# 過濾隱藏文件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)# 根據當前深度和最大深度決定是否繼續遞歸if self.max_depth is not None and self.depth > self.max_depth:continue# 構建前綴prefix = self.indent_symbol * self.depthif 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():"""主函數,用戶配置入口"""# 配置參數root_directory = input("請輸入要打印的目錄路徑: ") or os.getcwd()  # 默認為當前目錄hide_hidden_files = input("是否隱藏隱藏文件? (y/n): ").lower() != 'y'max_depth = input("請輸入最大遞歸深度 (留空表示無限制): ").strip() or None  # 無限制auto_print = input("是否自動打印目錄結構? (y/n): ").lower() == 'y'# 轉換為整數try:max_depth = int(max_depth) if max_depth else Noneexcept ValueError:print("最大遞歸深度必須為整數")return# 打印配置print("\n=== 配置 ===")print(f"根目錄: {root_directory}")print(f"隱藏文件和文件夾: {'是' if hide_hidden_files else '否'}")print(f"最大遞歸深度: {'無限制' if max_depth is None else max_depth}")# 初始化打印器printer = DirectoryPrinter(root_dir=root_directory,show_hidden=hide_hidden_files,max_depth=max_depth)# 開始打印if auto_print:print("\n=== 目錄結構 ===")printer.print_directory()else:input("\n按下回車鍵開始打印目錄結構...")print("\n=== 目錄結構 ===")printer.print_directory()# 程序主入口
if __name__ == "__main__":main()

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/87753.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/87753.shtml
英文地址,請注明出處:http://en.pswp.cn/web/87753.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Python】文件打開:with open具體解析

示例 # 使用 with 語句打開文件并讀取內容 with open(pi.txt, r) as file_object:contents file_object.read()print(contents) # 文件在代碼塊結束后自動關閉with 解析 with 是 Python 中的上下文管理器語法,用于確保某個操作完成后自動執行清理操作。它常用于文…

Acrel-1000系列分布式光伏監控系統在湖北荊門一馬光彩大市場屋頂光伏發電項目中應用

摘 要:分布式光伏發電能夠對日益嚴重的環境壓力起到有效緩解作用,在當前對環境保護需求越來越大情況下,發電行業在發展中不但要提升發電效率,同時也需要降低成本。分布式光伏發電主要是利用風能和太陽能等可再生清潔能源進行發電,對于空氣質量具有改善效果,和傳統發…

CentOS-6與CentOS-7的網絡配置IP設置方式對比 筆記250706

CentOS-6與CentOS-7的網絡配置IP設置方式對比 筆記250706 1?? 參考 1 CentOS-6 與 CentOS-7 的網絡配置IP設置方式對比 CentOS 6 和 CentOS 7 在網絡配置上存在顯著差異,主要體現在配置文件結構、管理工具、服務機制和命令集等方面。以下是兩者的核心對比&#x…

【網絡系列】HTTP 429 狀態碼

博客目錄 HTTP 429 狀態碼的定義與背景產生 429 錯誤的常見場景1. API 速率限制觸發2. 網絡爬蟲行為被檢測3. 分布式拒絕服務(DDoS)防護4. 用戶/IP 特定限流策略5. 應用程序邏輯錯誤 深入解讀 429 響應的關鍵頭部信息Retry-After 頭部X-RateLimit 系列頭部RateLimit 標準化頭部…

C++無鎖數據結構:CAS(Compare-and-Swap)

在高并發場景下,傳統鎖機制帶來的線程阻塞和上下文切換開銷成為性能瓶頸。無鎖數據結構通過原子操作實現線程安全,避免了鎖的使用,成為高性能系統的關鍵技術。本文將深入探討C中基于CAS(Compare-and-Swap)的無鎖數據結…

【數字圖像處理】

數字圖像處理 緒論1. 數字圖像處理基本概念2. 數字圖像處理系統的組成3. 數字圖像處理技術研究的內容4. 數字圖像處理技術的應用領域5. 圖像處理技術涉及的學科領域 圖像處理基礎1. 電磁波譜與可見光譜2. 人眼的亮度視覺特性3. 圖像的表示4. 空間分辨率和灰度級分辨率5. 像素間…

linux chrome瀏覽器打不開了

報錯信息 通過terminal執行google-chrome [12714:12714:0706/223620.723519:ERROR:chrome/browser/process_singleton_posix.cc:358] The profile appears to be in use by another Google Chrome process (54949) on another computer (192.168.0.17). Chrome has locked t…

Python:模塊

一、Python模塊基礎概念 1. 什么是Python模塊? 在 Python 中,模塊(Module) 是一個包含 Python 代碼的文件(擴展名為 .py),用于組織代碼、實現功能復用和命名空間管理。模塊可以包含變量、函數…

C 語言指針與作用域詳解

一、指針基礎概念 (一)指針的本質 指針是 C 語言中一個重要的概念,其本質是內存地址。在計算機內存中,每個字節都有唯一的編號,這個編號就是我們所說的內存地址,而指針變量就是用于存儲這些內存地址的變量…

解鎖阿里云ACK:開啟Kubernetes容器化應用新時代

引言:云原生時代下的 ACK 在當今數字化飛速發展的時代,云原生技術正以前所未有的速度改變著軟件開發和部署的格局。隨著企業對應用敏捷性、彈性擴展以及成本優化的需求日益增長,云原生已成為眾多企業實現數字化轉型的關鍵路徑。在云原生的技…

【C++基礎】內存管理四重奏:malloc/free vs new/delete - 面試高頻考點與真題解析

在 C/C 編程中,內存管理是核心基礎技能,而malloc/free和new/delete作為兩套內存分配釋放機制,是面試中高頻出現的考點。 一、內存管理的 "雙生花":基礎概念解析 1.1 malloc/free:C 語言的內存管家 malloc全…

Dify+Ollama+QwQ:3步本地部署,開啟AI搜索新篇章

如何來評價本地化部署的價值與優勢分析: 成本優化與隱私保障 自定義搜索插件,告別信息過載 一鍵生成報告、分析,效率翻倍! 接下來我們就嘗試跟隨來部署本地的價值所在! 1:安裝Ollama & 部署QwQ模型 1.1 安裝O…

FAISS 簡介及其與 GPT 的對接(RAG)

什么是 FAISS? FAISS (Facebook AI Similarity Search) 是 Facebook AI 團隊開發的一個高效的相似性搜索和密集向量聚類的庫。它主要用于: 大規模向量相似性搜索高維向量最近鄰檢索向量聚類 https://github.com/facebookresearch/faissFAISS 特別適合處理…

【Apache Doris 深度實戰:從 MPP 架構到實時分析,解鎖三大數據模型的性能優化秘籍】

一、安裝部署 安裝教程:GitHub地址 Doc文檔:Apache Doris 簡介 - Apache Doris 二、功能及作用 Apache Doris 是一款基于MPP 架構的高性能、實時分析型數據庫。它以高效、簡單和統一的特性著稱,能夠在亞秒級的時間內返回海量數據的查詢結果…

MySQL主從復制與讀寫分離概述

前言: 在數據驅動的現代應用中,數據庫面臨高并發讀寫與海量存儲的雙重挑戰。單一數據庫實例在性能、可用性及擴展性上逐漸成為瓶頸。MySQL主從復制(Master-Slave Replication)與讀寫分離(Read/Write Splitting&#xf…

數據庫-元數據表

1. 什么是元數據表元數據:數據的數據,用以描述數據的信息也是數據,被稱為元數據2. 獲取元數據的方法MySQL提供了以下三種方法用于獲取數據庫對象的元數據:show語句從INFORMATION_SCHEMA數據庫里查詢相關表(information…

【STM32】通用定時器PWM

STM32 通用定時器 PWM 輸出完全解析(以 TIM3_CH1 為例) PWM 輸出基本原理 PWM(Pulse Width Modulation)即脈沖寬度調制,是由定時器通過比較 CNT 與 CCR 寄存器實現的。 信號產生原理: ARR 決定周期&#…

python學習打卡:DAY 21 常見的降維算法

知識點回顧: LDA線性判別PCA主成分分析t-sne降維 還有一些其他的降維方式,也就是最重要的詞向量的加工,我們未來再說 浙大疏錦行

基于SpringBoot和Leaflet集成在線天氣服務的區縣當前天氣WebGIS實戰

目錄 前言 一、需求描述 1、功能需求 2、技術實現流程 二、SpringBoot后臺實現 1、控制層實現 2、區縣數據返回 三、WebGIS前端實現 1、區位信息展示 2、天氣信息展示 四、成果展示 1、魔都上海 2、蜀地成都 3、湖南桂東 五、總結 前言 在當今數字化時…

文心開源:文心大模型4.5系列全面開放,AI普惠時代加速到來

一場由4240億參數模型領銜的開源盛宴,正在重塑中國AI生態的底層邏輯 2025年6月30日,百度如約宣布全面開源其旗艦產品——文心大模型4.5系列。一次性開源10款模型,覆蓋從4240億參數的MoE多模態巨無霸到輕巧的0.3B端側模型,并同步開…