在使用Python开发项目的时候,会遇到需要遍历文件夹、文件的需求,我整理了三种主流方法:os.listdir
、os.walk
和os.scandir
,并进行了详细的讲解。
用于实验的目录:
.test├── dir_1│ ├── dir_1_file_1.txt│ ├── dir_1_file_2.txt│ ├── dir_1_file_3.txt│ └── sub_dir_1│ └── sub_file_1.txt├── dir_2│ └── dir_2_file_1.txt├── dir_3└── file_1.txt
os.listdir 简单暴力
os.listdir(path)
,返回path目录下的文件夹和文件,但不包含子文件夹里的文件夹和文件,并按照目录树结构的排序输出结果,即深度优先。
递归遍历所有文件,代码实例:
import osdef recursive_listdir(path):files = os.listdir(path)for file in files:file_path = os.path.join(path, file)if os.path.isfile(file_path):print(file)elif os.path.isdir(file_path):recursive_listdir(file_path)recursive_listdir(r'./test')
输出结果:
dir_1_file_2.txtdir_1_file_1.txtdir_1_file_3.txtsub_file_1.txtfile_1.txtdir_2_file_1.txt
os.walk 优雅
os.walk(top, topdown=True, onerror=None, followlinks=False)
,通过“自上而下”或“自下而上”来遍历目录,生成目录树中的文件夹名和文件名。
top:根目录下的每一个文件夹(包含它自己)topdown:可选,为True时,则自上而下,而为False时,则自下而上onerror:可选,是一个函数,OSError实例followlinks:可选,通过软链接访问目录
同时,结果是按照广度优先返回的,有三个结果,分布是文件夹路径、文件夹名称和文件名。
显示所有子目录,代码实例:
import ospaths = os.walk(r'./test')for path, dir_lst, file_lst in paths:for dir_name in dir_lst:print(os.path.join(path, dir_name))
输出结果:
./test/dir_1./test/dir_3./test/dir_2./test/dir_1/sub_dir_1
显示目录下所有文件,代码实例:
import ospaths = os.walk(r'./test')for path, dir_lst, file_lst in paths:for file_name in file_lst:print(os.path.join(path, file_name))
输出结果:
./test/file_1.txt./test/dir_1/dir_1_file_2.txt./test/dir_1/dir_1_file_1.txt./test/dir_1/dir_1_file_3.txt./test/dir_1/sub_dir_1/sub_file_1.txt./test/dir_2/dir_2_file_1.txt
os.scandir 高效
os.scandir(path)
,返回path目录树中对应的os.DirEntry
对象的迭代器(文件夹或文件),不包含子文件夹里的文件夹和文件,但运行效率比os.walk高,Python官方推荐使用os.scandir
来遍历目录树。
遍历目录树,代码实例:
import osdef traversal_files(path):for item in os.scandir(path):if item.is_dir():dirs.append(item.path)elif item.is_file():files.append(item.path)print('dirs:')print('\n'.join(dirs))print()print('files:')print('\n'.join(files))traversal_files(r'./test')
输出结果:
dirs:./test/dir_1./test/dir_3./test/dir_2files:./test/file_1.txt
最后,安利大家一本书《深入理解NLP的中文分词:从原理到实践》,让你从零掌握中文分词技术,踏入NLP的大门。
如果因为以上内容对你有所帮助,希望你能帮个忙,点个赞、评个论、转个发,关个注。
此公众号每周分享一篇干货文章,实实在在把一个课题说明白,讲清楚,望关注!
如果觉得《详细讲解Python遍历目录的文件夹(dir) 文件(file)的三种方法:os.listdir os.walk和os.scandir》对你有帮助,请点赞、收藏,并留下你的观点哦!