一、递归调用
1、使用os.listdir()
import osdef 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 Pathdef 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 osdef 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 * 2gen = my_generator()for value in gen: print(value)
在这个例子中,`my_generator` 函数定义了一个生成器,它会依次生成 0,2,4,6,8 这些值。每次调用迭代器的方法时,生成器都会暂停并返回当前的值。
### 迭代器(Iterators):
迭代器是 Python 中一种用于遍历容器类(如列表、元组、字典等)元素的对象。一个迭代器需要实现两个方法:
1. **`__iter__()`**:返回迭代器对象本身。
2. **`__next__()`**:返回容器的下一个元素,并在没有更多元素时抛出 `StopIteration` 异常。
### 总结:
生成器是迭代器的一种特例,提供了一种更加简便和高效的创建迭代器的方法。使用生成器可以方便地处理大量的数据,同时保持代码的简洁性和可读性。