likes
comments
collection
share

Python 深度遍历文件方法os.walk()全面解析

作者站长头像
站长
· 阅读数 40

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动

本文同时参与 「掘力星计划」 ,赢取创作大礼包,挑战创作激励金

Python语言中,当我们试图遍历一个目录下的文件时,我们会想到使用os.listdir()方法:

import os
os.listdir("path")

然而这种方法却有着一个致命的局限性:

当传入的目录下还有子目录时,该方法只能返回子目录名,而无法深度遍历子目录中的所有文件。

也就是说,使用os.listdir()无法遍历到子目录中的文件。

为了解决上述问题,实现真正的深度遍历,本文将向你介绍同为Python os库中的另一个方法——os.walk()

Let's go!

1.os.walk()使用方法介绍

1.1.语法

要使用os.walk()方法,我们首先需要导入Python的os库(废话)。

导入os库后,使用os.walk()方法的语法如下:

import os
​
os.walk(top[, topdown=True[, onerror=None[, followlinks=False]]])

简单的使用: os.walk()方法最主要的参数为 “top" ,也就是需要遍历的文件的路径,通常我们只需要使用这个参数就可以正常使用os.walk()方法了,即通过os.walk(top)就可以快速地深度遍历指定文件夹。

1.2.参数详解

参数名意义
top所要遍历的目录的地址
topdown可选,为 True,则优先遍历 top 目录,否则优先遍历 top 的子目录(默认为True)。人话就是: 如果为 True,先遍历top一级目录下的文件,然后再遍历一级目录中包含的子目录中的文件。
onerror可选,需要一个 callable 对象,当 walk 需要异常时,会调用。
followlinks可选,如果为 True,则会遍历目录下的快捷方式(Linux 下是软连接 symbolic link )实际所指的目录,如果为 False,则优先遍历 top 的子目录(默认False)。

1.3.返回值

通过使用isinstance()方法我们可以得知,os.walk()方法返回一个迭代器(Iterator)

import os
from collections.abc import Iterator
​
isinstance(os.walk('Downloads/chrome-2.0.0'),Iterator)  #路径为我自定义,不用在意这些细节
#输出;Ture

2.实际演示代码

本节采用名为chrome-2.0.0的目录进行深度遍历演示,其文件夹结构如下:

Python 深度遍历文件方法os.walk()全面解析

Python 深度遍历文件方法os.walk()全面解析

Python 深度遍历文件方法os.walk()全面解析

可以看到,chrome-2.0.0下含有6个文件与一个子目录assets,子目录assets中又有一个子目录imagesimages中包含5个文件。

2.1.以列表返回结果

由于直接使用os.walk()返回的是一个迭代器,因此通常我们需要将其转换为列表展示:

import os
​
traResult = list(os.walk('Downloads/chrome-2.0.0'))
print(traResult) 

上述代码返回的是一个列表,这个列表的元素是数个元组,具体数量等于目录下的子目录总数(包括子目录的子目录)加一(目录本身)。每个元组又由三个元素构成,分别是(‘当前路径’,[当前路径下包含的目录],[当前路径下包含的文件])。

上述代码输出结果为:

[('Downloads/chrome-2.0.0', ['assets'], ['background.js', 'browser-polyfill.min.js', 'browser-polyfill.min.js.map', 'manifest.json', 'popup.html', 'popup.js']), ('Downloads/chrome-2.0.0\assets', ['images'], []), ('Downloads/chrome-2.0.0\assets\images', [], ['128.png', '16.png', '32.png', '48.png', 'icon-large.png'])]

2.2使用循环返回结果(最常用)

显然第一种方法并不方便我们的使用与阅读,因此我们通常使用循环来读取遍历结果,示例代码如下:

import os
​
for root, dirs, files in os.walk("Downloads/chrome-2.0.0", topdown=False):
    for name in files:
        print(os.path.join(root, name))
    for name in dirs:
        print(os.path.join(root, name))

输出结果为:

Downloads/chrome-2.0.0\assets\images\128.png
Downloads/chrome-2.0.0\assets\images\16.png
Downloads/chrome-2.0.0\assets\images\32.png
Downloads/chrome-2.0.0\assets\images\48.png
Downloads/chrome-2.0.0\assets\images\icon-large.png
Downloads/chrome-2.0.0\assets\images
Downloads/chrome-2.0.0\background.js
Downloads/chrome-2.0.0\browser-polyfill.min.js
Downloads/chrome-2.0.0\browser-polyfill.min.js.map
Downloads/chrome-2.0.0\manifest.json
Downloads/chrome-2.0.0\popup.html
Downloads/chrome-2.0.0\popup.js
Downloads/chrome-2.0.0\assets

以上就是使用os.walk()方法来深度遍历文件的全面解析了,觉得不错还请点赞留言。

有什么意见或建议也烦请留言或者私信。