1、使用递归方法实现
1)使用os.listdir()
os.listdir()
是列出当前目录下边的所有文件信息。
import os from pprint import pformat def _get_dir_content(path, include_folders, recursive): entries = os.listdir(path) for entry in entries: entry_with_path = os.path.join(path, entry) if os.path.isdir(entry_with_path): if include_folders: yield entry_with_path if recursive: for sub_entry in _get_dir_content(entry_with_path, include_folders, recursive): yield sub_entry else: yield entry_with_path def get_dir_content(path, include_folders=True, recursive=True, prepend_folder_name=True): path_len = len(path) + len(os.path.sep) for item in _get_dir_content(path, include_folders, recursive): yield item if prepend_folder_name else item[path_len:] def _get_dir_content_old(path, include_folders, recursive): entries = os.listdir(path) ret = list() for entry in entries: entry_with_path = os.path.join(path, entry) if os.path.isdir(entry_with_path): if include_folders: ret.append(entry_with_path) if recursive: ret.extend(_get_dir_content_old(entry_with_path, include_folders, recursive)) else: ret.append(entry_with_path) return ret def get_dir_content_old(path, include_folders=True, recursive=True, prepend_folder_name=True): path_len = len(path) + len(os.path.sep) return [item if prepend_folder_name else item[path_len:] for item in _get_dir_content_old(path, include_folders, recursive)] def main(): root_dir = "root_dir" ret0 = get_dir_content(root_dir, include_folders=True, recursive=True, prepend_folder_name=True) lret0 = list(ret0) print(ret0, len(lret0), pformat(lret0)) ret1 = get_dir_content_old(root_dir, include_folders=False, recursive=True, prepend_folder_name=False) print(len(ret1), pformat(ret1)) if __name__ == "__main__": main()
2)使用os.scandir()
os.scandir()
方法,它是一个目录迭代方法,os.scandir()
的运行效率要比 os.walk()
高。
import os def scan_floder(srcpath,file_list): """ 使用os自带的scan方法遍历文件夹 """ for item in os.scandir(srcpath): if item.is_dir(): scan_floder(item.path,file_list) elif item.is_file(): file = item.name #获取路径文件名 if file.endswith('.txt'): #挑选nmon的文件 file_list.append(item.name) #print (item.name) if __name__ == "__main__": srcpath = r"F:/cjavapy" file_list =[] scan_floder(srcpath,file_list) for file in file_list: print (file)
2、使用os.walk()实现
os.walk()
主要用来扫描某个指定目录下所包含的子目录和文件。os.walk()
遍历的比较全面,包括空文件夹也会进行遍历。
import os print(os.walk('./')) for dirpath,dirnames,files in os.walk('./'): print(dirpath) # 文件夹的路径 print(dirnames) #dirpath这个文件夹下的子文件夹列表 print(files) # 文件
3、使用glob实现
glob模块是最简单的模块之一,用它可以查找符合特定规则的文件路径名。跟使用windows下的文件搜索差不多。查找文件只用到三个匹配符:”*”, “?”, “[]”。”*”匹配0个或多个字符;”?”匹配单个字符;”[]”匹配指定范围内的字符,如:[0-9]
匹配数字。glob.glob
返回所有匹配的文件路径列表。它只有一个参数pathname
,定义了文件路径匹配规则,可以是绝对路径,也可以是相对路径。
import glob #获取指定目录下的所有图片 print(glob.glob(r"E:/Picture/*/*.jpg")) #获取上级目录的所有.py文件 print(glob.glob(r'../*.py'))
4、使用pathlib实现
相对于 os
模块的 path
方法,Python3 标准库 pathlib
模块的 Path 对路径的操作会更简单。
import pathlib import os root_dir = "/etc/" root_dir_instance = pathlib.Path(root_dir) print(root_dir_instance) print(root_dir_instance.name) print(root_dir_instance.is_dir()) print([item.name for item in root_dir_instance.glob("*")]) print([os.path.join(item.parent.name, item.name) for item in root_dir_instance.glob("*") if not item.is_dir()])