详细讲解Python遍历目录的文件夹(dir)、文件(file)的三种方法:os.listdir、os.walk和os.scandir

在使用Python开发项目的时候,会遇到需要遍历文件夹、文件的需求,我整理了三种主流方法:os.listdiros.walkos.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 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 优雅

os.walk(top, topdown=True, onerror=None, followlinks=False),通过“自上而下”或“自下而上”来遍历目录,生成目录树中的文件夹名和文件名。

  • top:根目录下的每一个文件夹(包含它自己)
  • topdown:可选,为True时,则自上而下,而为False时,则自下而上
  • onerror:可选,是一个函数,OSError实例
  • followlinks:可选,通过软链接访问目录

同时,结果是按照广度优先返回的,有三个结果,分布是文件夹路径、文件夹名称和文件名。

显示所有子目录,代码实例:

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 高效

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的大门。

如果因为以上内容对你有所帮助,希望你能帮个忙,点个赞、评个论、转个发,关个注。

此公众号每周分享一篇干货文章,实实在在把一个课题说明白,讲清楚,望关注!
惠惠周刊

你可能感兴趣的:(python,运维,linux)