如何在 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+ 浏览量

开启您的 职业生涯

通过完成课程获得认证

立即开始
广告