在使用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(path)
,返回path目录下的文件夹和文件,但不包含子文件夹里的文件夹和文件,并按照目录树结构的排序输出结果,即深度优先。
递归遍历所有文件,代码实例:
import os
def 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.txt
dir_1_file_1.txt
dir_1_file_3.txt
sub_file_1.txt
file_1.txt
dir_2_file_1.txt
os.walk(top, topdown=True, onerror=None, followlinks=False)
,通过“自上而下”或“自下而上”来遍历目录,生成目录树中的文件夹名和文件名。
同时,结果是按照广度优先返回的,有三个结果,分布是文件夹路径、文件夹名称和文件名。
显示所有子目录,代码实例:
import os
paths = 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 os
paths = 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(path)
,返回path目录树中对应的os.DirEntry
对象的迭代器(文件夹或文件),不包含子文件夹里的文件夹和文件,但运行效率比os.walk高,Python官方推荐使用os.scandir
来遍历目录树。
遍历目录树,代码实例:
import os
def 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_2
files:
./test/file_1.txt
最后,安利大家一本书《深入理解NLP的中文分词:从原理到实践》,让你从零掌握中文分词技术,踏入NLP的大门。
如果因为以上内容对你有所帮助,希望你能帮个忙,点个赞、评个论、转个发,关个注。
此公众号每周分享一篇干货文章,实实在在把一个课题说明白,讲清楚,望关注!