开发手册 欢迎您!
软件开发者资料库

Python 遍历指定文件夹下所有文件批量操作的方法

Python中进行程序开发时,有些文件操作的需求可能需要我们对文件夹下的所有文件进行批量操作。本文主要介绍一下Python中对指定文件夹下所有文件进行批量操作的方法。

1、使用递归方法实现

1)使用os.listdir()

os.listdir()是列出当前目录下边的所有文件信息。

import osfrom pprint import pformatdef _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_pathdef 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 retdef 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 osdef 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:/wonhero"    file_list =[]    scan_floder(srcpath,file_list)    for file in file_list:        print (file)

2、使用os.walk()实现

os.walk()主要用来扫描某个指定目录下所包含的子目录和文件。os.walk()遍历的比较全面,包括空文件夹也会进行遍历。

import osprint(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 pathlibimport osroot_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()])