本文记录了 Python 内置 os.walk() 方法遍历指定路径所有文件和文件夹的相关代码。
前言
项目中有个功能需要遍历指定路径下的文件内容,而 Python 有个内置的 os.walk 方法可以达到这个目的。
以下为 Python 文档中对于 os.walk 的说明。
Generate the file names in a directory tree by walking the tree either top-down or bottom-up. For each directory in the tree rooted at directory top (including top itself), it yields a 3-tuple (dirpath, dirnames, filenames).
本文来讲解一下 os.walk 方法的使用。
代码讲解
此部分正式开始 os.walk 方法的使用讲解。
官方代码
-
首先来看一组官方的代码
import os from os.path import join, getsize for root, dirs, files in os.walk('python/Lib/email'): print(root, "consumes", end=" ") print(sum(getsize(join(root, name)) for name in files), end=" ") print("bytes in", len(files), "non-directory files") if 'CVS' in dirs: dirs.remove('CVS') # don't visit CVS directories
-
此处解释一下代码中的变量含义:
root
: 当前遍历的路径,字符串类型(当为 os.walk 传入相对路径时,该值为相对路径)dirs
: 当前遍历路径下的文件夹名称,列表类型files
: 当前遍历路径下的文件名称,列表类型
-
再来看第二组官方提供的代码
# Delete everything reachable from the directory named in "top", # assuming there are no symbolic links. # CAUTION: This is dangerous! For example, if top == '/', it # could delete all your disk files. import os for root, dirs, files in os.walk(top, topdown=False): for name in files: os.remove(os.path.join(root, name)) for name in dirs: os.rmdir(os.path.join(root, name))
这组代码的作用是删除指定路径下的所有文件
扩展代码
- 理解了官方给的例子后,现在来改进封装一下
from os import walk from os.path import join def get_local_files(path, file_type=None): """ 获取目标路径下所需要类型文件的完整路径 :param path: 目标路径 :param file_type: 所需要的文件类型,列表或元组 :return: 完整的文件路径列表 """ local_files = [] for root, dirs, files in walk(path): for file in files: file_path = join(root, file) if file_type is None: local_files.append(file_path) elif file_path.split('.')[-1] in file_type: local_files.append(file_path) return local_files if __name__ == '__main__': curr_files = get_local_files(r'C:\Users\dancy\Documents\Adobe', ['jpg', 'png']) for i in curr_files: print(i)
总结
os.walk 函数返回的是一个 generator
类型,需要使用 for 循环取出其中的数据。
os.walk 的其它参数(topdown
、 onerror
、 followlinks
)用的较少,有需要的可以自行研究。