返回

Python中如何获取当前目录下的所有子目录?

python

Python中获取当前目录下的所有子目录

背景

在进行文件和目录操作时,经常需要获取当前目录下的所有子目录列表。Python中有多种方法可以实现这一操作,本文将介绍两种常见的方法:os.listdir()glob.glob()

os.listdir() 方法

os.listdir() 函数返回当前目录下的所有文件和目录列表。要仅获取子目录,我们可以使用os.path.isdir() 函数过滤结果。

import os

# 获取当前目录下的所有文件和目录
entries = os.listdir('.')

# 过滤出子目录
subdirectories = [entry for entry in entries if os.path.isdir(entry)]

glob.glob() 方法

glob.glob() 函数可以根据模式匹配文件和目录。要匹配所有子目录,可以使用以下模式:

import glob

# 获取当前目录下的所有子目录
subdirectories = glob.glob('*/')

代码示例

假设当前目录有以下文件和目录结构:

├── file1.txt
├── file2.txt
├── subdirectory1
│   ├── file3.txt
│   └── file4.txt
├── subdirectory2
│   ├── file5.txt
│   └── file6.txt

使用 os.listdir() 方法:

import os

# 获取当前目录下的所有文件和目录
entries = os.listdir('.')

# 过滤出子目录
subdirectories = [entry for entry in entries if os.path.isdir(entry)]

# 打印子目录列表
print(subdirectories)

输出:

['subdirectory1', 'subdirectory2']

使用 glob.glob() 方法:

import glob

# 获取当前目录下的所有子目录
subdirectories = glob.glob('*/')

# 打印子目录列表
print(subdirectories)

输出:

['subdirectory1/', 'subdirectory2/']

注意:

  • 使用 glob.glob() 方法时,返回的路径带有结尾的斜杠(/),表示子目录。
  • 这些方法仅返回子目录的名称,不返回绝对路径。要获取绝对路径,可以使用 os.path.abspath() 函数。

结论

os.listdir()glob.glob() 方法都是获取当前目录下所有子目录的有效方法,具体选择取决于需要考虑的特定需求。

常见问题解答

1. 如何过滤出特定类型的子目录?

使用 os.listdir() 方法时,可以使用 os.path.isdir() 函数过滤出子目录。要过滤出特定类型的子目录,可以在 os.path.isdir() 中指定额外的条件,例如:

subdirectories = [entry for entry in entries if os.path.isdir(entry) and entry.endswith('.txt')]

2. 如何获取子目录的绝对路径?

使用 os.path.abspath() 函数可以获取子目录的绝对路径:

absolute_paths = [os.path.abspath(subdirectory) for subdirectory in subdirectories]

3. 如何递归获取所有子目录?

要递归获取所有子目录,可以使用 os.walk() 函数。以下是一个递归函数的示例:

import os

def get_all_subdirectories(path):
  for root, directories, files in os.walk(path):
    for directory in directories:
      yield os.path.join(root, directory)

4. 如何处理包含隐藏文件的子目录?

默认情况下,os.listdir()glob.glob() 方法不会返回隐藏文件。要处理隐藏文件,可以使用 os.scandir() 函数:

for entry in os.scandir('.'):
  if entry.is_dir():
    print(entry.name)

5. 我可以使用哪种方法更有效率地处理大量子目录?

如果需要处理大量子目录,使用 os.walk() 函数可能更有效率,因为它可以避免频繁地调用 os.listdir()glob.glob() 函数。