python 遍历文件夹中的 子文件夹 以及 文件 的三种方法

您所在的位置:网站首页 python读取一个文件夹和其中的文件不一样怎么办 python 遍历文件夹中的 子文件夹 以及 文件 的三种方法

python 遍历文件夹中的 子文件夹 以及 文件 的三种方法

2024-01-26 14:12| 来源: 网络整理| 查看: 265

目录

一、使用os.listdir()函数+递归的方式实现

二、使用os.walk()函数实现

三、函数式编程实现

一、使用os.listdir()函数+递归的方式实现

【实现代码】:

import os     image_path = 'F:\\test\\frames' # 遍历文件夹及其子文件夹中的文件,并存储在一个列表中 # 输入文件夹路径、空文件列表[] # 返回 文件列表Filelist,包含文件名(完整路径) def get_filelist(dir, Filelist):     newDir = dir     if os.path.isfile(dir):         Filelist.append(dir)         # # 若只是要返回文件文,使用这个         # Filelist.append(os.path.basename(dir))     elif os.path.isdir(dir):         for s in os.listdir(dir):             # 如果需要忽略某些文件夹,使用以下代码             #if s == "xxx":                 #continue             newDir=os.path.join(dir,s)             get_filelist(newDir, Filelist)     return Filelist   if __name__ =='__main__' :     list = get_filelist('F:\\test\\frames', [])     print(len(list))     for e in list:         print(e) 【补充说明】: 1、os.path.basename()函数用于返回路径path最后的文件名。若path以/或\结尾,那么就会返回空值。例如: 二、使用os.walk()函数实现

思路很简单,首先遍历目录下所有文件(这里指广义的文件),然后对文件进行判断(属性是否为目录,后缀是否为xxx)。而python提供的功能更为强大,利用os模块的walk方法能直接遍历当前目录和整个子目录的文件。

后面3个自定义选项暂时可以不考虑(详细可以参考help(os.walk)),top即顶层目录,walk返回一个生成器,迭代每个生成器会返回一个三元组(dirpath, dirnames, filenames),依次代表目录名,该目录下的目录类型文件列表(不包括.和..),该目录下的非目录类型文件列表。

【实现代码】

import os path ='F:\\test\\frames' def get_filelist(dir):     Filelist = []     for home, dirs, files in os.walk(path):         for filename in files:             # 文件名列表,包含完整路径             Filelist.append(os.path.join(home, filename))             # # 文件名列表,只包含文件名             # Filelist.append( filename)     return Filelist   if __name__ =="__main__":     Filelist = get_filelist(dir)     print(len( Filelist))     for file in  Filelist :         print(file)

 

【补充说明】:

walk(top, topdown=True, onerror=None, followlinks=False) Directory tree generator. For each directory in the directory tree rooted at top (including top itself, but excluding '.' and '..'), yields a 3-tuple dirpath, dirnames, filenames dirpath is a string, the path to the directory. dirnames is a list of the names of the subdirectories in dirpath (excluding '.' and '..'). filenames is a list of the names of the non-directory files in dirpath. Note that the names in the lists are just names, with no path components. To get a full path (which begins with top) to a file or directory in dirpath, do os.path.join(dirpath, name). os.walk的函数声明为: walk(top, topdown=True, onerror=None, followlinks=False) 参数: top 是你所要便利的目录的地址 topdown 为真,则优先遍历top目录,否则优先遍历top的子目录(默认为开启) onerror 需要一个 callable 对象,当walk需要异常时,会调用 followlinks 如果为真,则会遍历目录下的快捷方式(linux 下是 symbolic link)实际所指的目录(默认 关闭) os.walk 的返回值是一个生成器(generator),也就是说我们需要不断的遍历它,来获得所有的内容。 每次遍历的对象都是返回的是一个三元组(root,dirs,files) root 所指的是当前正在遍历的这个文件夹的本身的地址 dirs 是一个 list ,内容是该文件夹中所有的目录的名字(不包括子目录) files 同样是 list , 内容是该文件夹中所有的文件(不包括子目录)

 

>>> import os >>> for parent, dirnames, filenames in os.walk('./cpp'): ... for dirname in dirnames: ... print('[DIR]', dirname) ... for filename in filenames: ... print('[FILE]', filename) ... break ... [DIR] string [DIR] lists [DIR] bitree [DIR] reference [DIR] threads [FILE] test.cc [FILE] binary_tree.c [FILE] shared_ptr.cc [FILE] get_arraysize.cc [FILE] subset_all.cc [FILE] bind_demo.cc [FILE] a.out [FILE] binary_tree.cpp

上述代码即遍历当前目录的所有文件并打印文件名,若去掉break则可以深层次遍历所有子目录。 至于后续操作则借用下列方法即可

os.listdir(path=None) 获取目录下所有文件名,若未指定path则默认路径为当前目录。类似Linux下的ls命令os.path.join(a, *p) 用'/'或者其他连接符(比如windows下为'\')将路径列表连接起来os.path.isdir(s) s为完整路径,若s为目录类型则返回Trueos.path.splitext(p) p为文件路径(不一定是完整路径),返回二元组(root, ext),ext即后缀 三、函数式编程实现

最近刚接触了下python对函数式编程的支持,代码确实优雅不少,对性能没有严格要求的情景下这种风格的代码看起来非常舒服。

def subdir_list(dirname): """获取目录下所有子目录名 @param dirname: str 目录的完整路径 @return: list(str) 所有子目录完整路径组成的列表 """ return list(filter(os.path.isdir, map(lambda filename: os.path.join(dirname, filename), os.listdir(dirname) ) )) def file_list(dirname, ext='.csv'): """获取目录下所有特定后缀的文件 @param dirname: str 目录的完整路径 @param ext: str 后缀名, 以点号开头 @return: list(str) 所有子文件名(不包含路径)组成的列表 """ return list(filter( lambda filename: os.path.splitext(filename)[1] == ext, os.listdir(dirname) ))

 



【本文地址】


今日新闻


推荐新闻


    CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3