python 获取多个多级子目录及其子文件

一、递归调用

1、使用os.listdir()

import os

def list_files_and_folders(path):
    # 遍历指定路径
    for item in os.listdir(path):
        item_path = os.path.join(path, item)  # 获取完整路径
        print(item_path)  # 打印当前文件或文件夹的路径
        
        if os.path.isdir(item_path):  # 如果是文件夹,则递归调用
            list_files_and_folders(item_path)

list_files_and_folders('/root/work/')

2、使用 pathlib 模块

from pathlib import Path

def list_files_and_folders(path):
    # 将传入的路径转换为 Path 对象
    p = Path(path)
    
    for item in p.iterdir():  # 遍历目录下的项目
        print(item)  # 打印文件或文件夹的路径
        
        if item.is_dir():  # 如果是文件夹,则递归调用
            list_files_and_folders(item)

# 使用示例
list_files_and_folders('/root/work/')

二、使用os.walk

1、os.walk() 是一个生成器,用于遍历目录树。它会为每个目录生成一个三元组 (dirpath, dirnames, filenames),其中:

  • dirpath:当前访问的路径。
  • dirnames:当前路径下所有子目录的名字(不包含路径)。
  • filenames:当前路径下所有非目录文件的名字(不包含路径)。
import os

def list_files_and_folders(path):
    for dirpath, dirnames, filenames in os.walk(path):
        print(f"当前目录: {dirpath}")
        
        for dirname in dirnames:
            print(f"子目录: {os.path.join(dirpath, dirname)}")
        
        for filename in filenames:
            print(f"文件: {os.path.join(dirpath, filename)}")

# 使用示例
list_files_and_folders('/root/work/')

2、案例

import os
import re

# 指定包含 HTML 文件的根目录
root_directory = '/Users/sanpangdan/Desktop/emr/'

# 定义去除 <data> 标签及其内容的函数
def remove_data_label(file_path):
    with open(file_path, 'r', encoding='utf-8') as file:
        content = file.read()

    updated_content = re.sub(r'<data>.*?</data>', '', content, flags=re.DOTALL)

    with open(file_path, 'w', encoding='utf-8') as file:
        file.write(updated_content)
    print('处理完成:', file_path)

# 遍历目录中的所有 HTML 文件
for dirpath, dirnames, filenames in os.walk(root_directory):
    for filename in filenames:
        if filename.endswith('.html'):
            file_path = os.path.join(dirpath, filename)
            remove_data_label(file_path)

print("处理完成,已去除 <data> 标签及其内容。")

补充

生成器(Generators)是 Python 中一种用于创建迭代器的简单而强大的工具。与普通的函数不同,生成器使用 `yield` 语句来返回值,而不是使用 `return` 语句。这使得生成器能够在多次调用之间保留其状态,从而在需要时生成一系列的值。

### 生成器的特点:

1. **惰性求值**:生成器会在每次请求时动态生成值,而不是一次性计算所有值。这使得生成器在处理大型数据集时更为高效,因为它们不会占用过多的内存。

2. **状态保持**:生成器能够保留状态,每次调用时从上一次停止的地方继续执行。

3. **简洁的语法**:创建生成器可以使用简单的函数定义,加上 `yield` 语句,而不需要实现完整的迭代器协议(`__iter__()` 和 `__next__()` 方法)。

### 示例代码:

def my_generator():
for i in range(5):
yield i * 2

gen = my_generator()

for value in gen:
print(value)

在这个例子中,`my_generator` 函数定义了一个生成器,它会依次生成 0,2,4,6,8 这些值。每次调用迭代器的方法时,生成器都会暂停并返回当前的值。

### 迭代器(Iterators):

迭代器是 Python 中一种用于遍历容器类(如列表、元组、字典等)元素的对象。一个迭代器需要实现两个方法:

1. **`__iter__()`**:返回迭代器对象本身。
2. **`__next__()`**:返回容器的下一个元素,并在没有更多元素时抛出 `StopIteration` 异常。

### 总结:

生成器是迭代器的一种特例,提供了一种更加简便和高效的创建迭代器的方法。使用生成器可以方便地处理大量的数据,同时保持代码的简洁性和可读性。

 

posted @ 2025-01-09 11:17  凡人半睁眼  阅读(202)  评论(0)    收藏  举报