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

一、递归调用

1、使用os.listdir()

1
2
3
4
5
6
7
8
9
10
11
12
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 模块

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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:当前路径下所有非目录文件的名字(不包含路径)。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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、案例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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__()` 方法)。

### 示例代码:

1
2
3
4
5
6
7
8
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 @   凡人半睁眼  阅读(28)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)
历史上的今天:
2024-01-09 重建mysql从库、表数据迁移
2020-01-09 镜像的导入和导出

阅读目录(Content)

此页目录为空

点击右上角即可分享
微信分享提示