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` 异常。
### 总结:
生成器是迭代器的一种特例,提供了一种更加简便和高效的创建迭代器的方法。使用生成器可以方便地处理大量的数据,同时保持代码的简洁性和可读性。

浙公网安备 33010602011771号