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