当前位置:   article > 正文

python 遍历文件夹中的 子文件夹 以及 文件 的三种方法_python 遍历文件夹和子文件夹下的所有文件

python 遍历文件夹和子文件夹下的所有文件

目录

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

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

三、函数式编程实现


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


【实现代码】:

  1. import os
  2.  
  3.  
  4. image_path = 'F:\\test\\frames'
  5. # 遍历文件夹及其子文件夹中的文件,并存储在一个列表中
  6. # 输入文件夹路径、空文件列表[]
  7. # 返回 文件列表Filelist,包含文件名(完整路径)
  8. def get_filelist(dir, Filelist):
  9.     newDir = dir
  10.     if os.path.isfile(dir):
  11.         Filelist.append(dir)
  12.         # # 若只是要返回文件文,使用这个
  13.         # Filelist.append(os.path.basename(dir))
  14.     elif os.path.isdir(dir):
  15.         for s in os.listdir(dir):
  16.             # 如果需要忽略某些文件夹,使用以下代码
  17.             #if s == "xxx":
  18.                 #continue
  19.             newDir=os.path.join(dir,s)
  20.             get_filelist(newDir, Filelist)
  21.     return Filelist
  22.  
  23. if __name__ =='__main__' :
  24.     list = get_filelist('F:\\test\\frames', [])
  25.     print(len(list))
  26.     for e in list:
  27.         print(e)
  1. 【补充说明】:
  2. 1os.path.basename()函数用于返回路径path最后的文件名。若path以/或\结尾,那么就会返回空值。例如:

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

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

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

【实现代码】

  1. import os
  2. path ='F:\\test\\frames'
  3. def get_filelist(dir):
  4.     Filelist = []
  5.     for home, dirs, files in os.walk(path):
  6.         for filename in files:
  7.             # 文件名列表,包含完整路径
  8.             Filelist.append(os.path.join(home, filename))
  9.             # # 文件名列表,只包含文件名
  10.             # Filelist.append( filename)
  11.     return Filelist
  12.  
  13. if __name__ =="__main__":
  14.     Filelist = get_filelist(dir)
  15.     print(len( Filelist))
  16.     for file in  Filelist :
  17.         print(file)

 

【补充说明】:

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

 

  1. >>> import os
  2. >>> for parent, dirnames, filenames in os.walk('./cpp'):
  3. ... for dirname in dirnames:
  4. ... print('[DIR]', dirname)
  5. ... for filename in filenames:
  6. ... print('[FILE]', filename)
  7. ... break
  8. ...
  9. [DIR] string
  10. [DIR] lists
  11. [DIR] bitree
  12. [DIR] reference
  13. [DIR] threads
  14. [FILE] test.cc
  15. [FILE] binary_tree.c
  16. [FILE] shared_ptr.cc
  17. [FILE] get_arraysize.cc
  18. [FILE] subset_all.cc
  19. [FILE] bind_demo.cc
  20. [FILE] a.out
  21. [FILE] binary_tree.cpp

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

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

三、函数式编程实现

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

  1. def subdir_list(dirname):
  2. """获取目录下所有子目录名
  3. @param dirname: str 目录的完整路径
  4. @return: list(str) 所有子目录完整路径组成的列表
  5. """
  6. return list(filter(os.path.isdir,
  7. map(lambda filename: os.path.join(dirname, filename),
  8. os.listdir(dirname) )
  9. ))
  10. def file_list(dirname, ext='.csv'):
  11. """获取目录下所有特定后缀的文件
  12. @param dirname: str 目录的完整路径
  13. @param ext: str 后缀名, 以点号开头
  14. @return: list(str) 所有子文件名(不包含路径)组成的列表
  15. """
  16. return list(filter( lambda filename: os.path.splitext(filename)[1] == ext,
  17. os.listdir(dirname) ))
'
运行

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小舞很执着/article/detail/838435
推荐阅读
相关标签
  

闽ICP备14008679号