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()])