一、问题的提出
之前,我们探索了如何用Python来遍历子目录文件,详情可以见下面的文章:
PythonFan:Python遍历子目录文件的多种方法5 赞同 · 0 评论文章正在上传…重新上传取消https://zhuanlan.zhihu.com/p/609327324
以上方面有pathlib,os等,可谓是无法八门,但是上面提到的方法用到的代码还是有点儿多,于是,我考虑如何用列表推导式来减少代码,使程序运行的速度更快。
二、列表推导式遍历子目录
- 目标:遍历当前目录及子目录下所有的pdf文件,包括后缀是.PDF的文件
- 方法:我们尝试了以下几种方法
import os,glob
from pathlib import Path
files = os.scandir()
print([file.name for file in os.scandir() if file.is_file() and file.name.endswith(".pdf")]) #第一种方法
print([file for file in os.listdir() if file.endswith(".pdf")]) # 第二种方法
print([file.name for file in Path(".").rglob(r"*.pdf")]) #第三种方法
print([file for file in os.walk(".")][0][2]) # 第四种方法
print([file for file in glob.glob("*.pdf")]) # 第五种方法
3. 效果展示
效果展示
3. 方法评估
第一种方法用scandir(),速度要快于os.walk(),可以获取子目录。第二种方法无法获取子目录,所以当遍历所有子目录时,建议用scandir()。
第三种方法和第五种方法,可以实现遍历扩展名为【.pdf】和【.PDF】的文件,而不用指定扩展名大小写,因此较为精确,因此推推荐第三种和第五种方法。
第四种方法用os.walk()和列表推导式只能得出子目录的文件,不能指定文件属性,因此较为不便。
三、学后反思
- 知道了如何遍历子目录,还需要知道如何快速遍历,因为有时文件比较多。
- 列表推导式在遍历目录时可以简化流程,减少代码量,提升效率,因此可以在Python中多多使用。
- 残途同归的多种方法可以为我们提供解决问题的不同思路,便于我们进行比较,找到更为合适的方法。