如何在 Python 中列出目錄樹結構?


在使用 Python 處理檔案系統和目錄時,瞭解目錄的結構及其內容對於高效的檔案管理和組織至關重要。Python 提供了多種方法和庫,使您能夠以全面而詳盡的方式列出目錄樹結構,包括所有子目錄和檔案。無論您是組織檔案、分析目錄結構還是執行資料處理任務,瞭解如何在 Python 中列出目錄樹結構都將顯著增強您的檔案處理能力。

在這篇擴充套件文章中,我們將探討在 Python 中列出目錄樹結構的不同方法。我們還將提供分步說明和程式碼示例,指導您完成整個過程。無論您是喜歡使用“os”模組、“pathlib”模組還是第三方庫,本指南都將為您提供瀏覽目錄結構和訪問有關檔案和目錄的寶貴資訊的工具。

讓我們開始使用 Python 進行目錄樹探索之旅,揭開列出目錄結構的秘密!

使用 os.walk() 進行遞迴目錄遍歷

“os.walk()”函式是用於遍歷 Python 中目錄樹的強大工具。它允許您遞迴地列出給定起始目錄及其子目錄中的所有目錄和檔案。

示例

  • 在下面的程式碼中,我們匯入“os”模組,該模組提供了與作業系統互動的功能,包括目錄操作。

  • “list_directory_tree_with_os_walk()”函式以“starting_directory”作為輸入,並使用“os.walk()”列出整個目錄樹結構。

  • 在迭代過程中,“os.walk()”返回三個值:根路徑、當前目錄中的目錄列表以及當前目錄中的檔案列表。

  • 我們使用“for”迴圈迭代從“os.walk()”獲得的根、目錄和檔案。

  • 對於每次迭代,我們列印當前目錄路徑(“root”)並列出該目錄中的所有檔案。

import os

def list_directory_tree_with_os_walk(starting_directory):
    for root, directories, files in os.walk(starting_directory):
        print(f"Directory: {root}")
        for file in files:
            print(f"  File: {file}")

利用 pathlib.Path 進行目錄樹遍歷

“pathlib”模組提供了一種更現代、面向物件的方式來遍歷 Python 中的目錄樹。“rglob()”方法遞迴地列出指定目錄及其子目錄中的所有檔案。

示例

  • 在此示例中,我們從“pathlib”模組匯入“Path”類,該類表示檔案系統路徑。

  • “list_directory_tree_with_pathlib()”函式以“starting_directory”作為輸入,並使用“pathlib”列出整個目錄樹結構。

  • 我們使用“Path(starting_directory)”建立一個“Path”物件,其中“starting_directory”是輸入目錄。

  • 我們對“Path”物件使用“rglob('*')”方法來遞迴地列出指定目錄及其子目錄中的所有檔案和目錄。

  • 在迭代過程中,我們使用“file_path.is_file()”檢查當前項是否為檔案,並使用“file_path.is_dir()”檢查其是否為目錄。

  • 然後,我們相應地列印檔案或目錄路徑。

from pathlib import Path

def list_directory_tree_with_pathlib(starting_directory):
    path_object = Path(starting_directory)
    for file_path in path_object.rglob('*'):
        if file_path.is_file():
            print(f"File: {file_path}")
        elif file_path.is_dir():
            print(f"Directory: {file_path}")

顯示縮排以獲得更好的結構

為了提高目錄樹結構的可讀性,我們可以使用遞迴根據子目錄的深度顯示縮排。

示例

  • 在下面的程式碼中,我們定義了“list_directory_tree_with_indentation()”函式,該函式列出整個目錄樹結構,並使用縮排以提高可讀性。

  • 該函式以“directory”和“indent”作為輸入,其中“directory”是起始目錄,“indent”是當前縮排級別。

  • 我們使用“os.listdir(directory)”獲取指定目錄中項(檔案和目錄)的列表。

  • 對於每個項,我們使用“os.path.join(directory, item)”構造其完整路徑。

  • 如果該項是檔案,我們將列印其名稱,並根據當前級別(“{' ' * indent}”)進行縮排。

  • 如果該項是目錄,我們將列印其名稱並使用縮排,並遞迴呼叫“list_directory_tree_with_indentation()”函式,並將子目錄路徑和遞增的“indent”值作為引數傳遞。

import os

def list_directory_tree_with_indentation(directory, indent=0):
    for item in os.listdir(directory):
        item_path = os.path.join(directory, item)
        if os.path.isfile(item_path):
            print(f"{'  ' * indent}File: {item}")
        elif os.path.isdir(item_path):
            print(f"{'  ' * indent}Directory: {item}")
            list_directory_tree_with_indentation(item_path, indent+1)

從列表中排除某些目錄

在某些情況下,您可能希望從列表中排除特定目錄。Python 提供了使用各種技術過濾掉不需要的目錄的選項。

示例

  • “list_directory_tree_exclude_directories()”函式允許您列出目錄樹結構,同時從列表中排除特定目錄。

  • 它以“directory”和“exclude_dirs”(要排除的目錄列表)作為輸入。

  • 我們使用“os.listdir(directory)”獲取指定目錄中項(檔案和目錄)的列表。

  • 對於每個項,我們使用“os.path.join(directory, item)”構造其完整路徑。

  • 如果該項是檔案,我們將照常列印其名稱。

  • 如果該項是目錄,我們將使用“item not in exclude_dirs”檢查其名稱是否出現在“exclude_dirs”列表中。

  • 如果它不在列表中,我們將列印其名稱並遞迴呼叫“list_directory_tree_exclude_directories()”函式,並將子目錄路徑和相同的“exclude_dirs”列表作為引數傳遞。

import os

def list_directory_tree_exclude_directories(directory, exclude_dirs=[]):
    for item in os.listdir(directory):
        item_path = os.path.join(directory, item)
        if os.path.isfile(item_path):
            print(f"File: {item}")
        elif os.path.isdir(item_path):
            if item not in exclude_dirs:
                print(f"Directory: {item}")
                list_directory_tree_exclude_directories(item_path, exclude_dirs)

顯示檔案大小和上次修改日期

要獲取有關目錄樹中檔案的其他資訊,例如檔案大小和上次修改日期,我們可以使用“os.path”模組和“os.stat()”函式。

示例

  • “list_directory_tree_with_file_info()”函式列出目錄樹結構,幷包含有關檔案(如檔案大小和上次修改日期)的其他資訊。

  • 它以“directory”作為輸入。

  • 我們使用“os.listdir(directory)”獲取指定目錄中項(檔案和目錄)的列表。

  • 對於每個項,我們使用“os.path.join(directory, item)”構造其完整路徑。

  • 如果該項是檔案,我們將使用“os.path.getsize(item_path)”獲取以位元組為單位的檔案大小,並使用“os.path.getmtime(item_path)”獲取上次修改時間戳。

  • 我們使用“datetime.fromtimestamp()”將時間戳轉換為人類可讀的格式。

  • 如果該項是目錄,我們將列印其名稱並遞迴呼叫“list_directory_tree_with_file_info()”函式,並將子目錄路徑作為引數傳遞,以獲取所有巢狀目錄和檔案的檔案資訊。

import os
from datetime import datetime

def list_directory_tree_with_file_info(directory):
    for item in os.listdir(directory):
        item_path = os.path.join(directory, item)
        if os.path.isfile(item_path):
            file_size = os.path.getsize(item_path)
            last_modified = datetime.fromtimestamp(os.path.getmtime(item_path))
            print(f"File: {item} - Size: {file_size} bytes - Last Modified: {last_modified}")
        elif os.path.isdir(item_path):
            print(f"Directory: {item}")
            list_directory_tree_with_file_info(item_path)

在這篇綜合文章中,我們探討了在 Python 中列出目錄樹結構的各種方法。透過使用“os.walk()”、“pathlib”、“遞迴”和“過濾”等技術,您可以有效地瀏覽目錄結構並訪問有關檔案和目錄的寶貴資訊。無論您需要簡單的列表還是更詳細的檔案資訊,Python 都提供了一系列工具來輕鬆處理目錄樹。掌握這些方法將使您能夠執行復雜的檔案管理任務、最佳化資料處理並有效地組織您的專案。

更新於: 2023-09-11

6K+ 瀏覽量

開啟您的 職業生涯

透過完成課程獲得認證

立即開始
廣告

© . All rights reserved.