os.walk() 是 Python 中 os 模块提供的一个用于递归遍历目录树的函数。它生成一个三元组 (dirpath, dirnames, filenames),分别包含当前目录路径、子目录列表和文件列表。os.walk() 非常适合用于文件系统操作,比如查找特定类型的文件、复制或删除文件等。

函数定义

os.walk(top, topdown=True, onerror=None, followlinks=False)

参数

  • top:必需参数,表示要遍历的目录的路径。

  • topdown:可选参数,布尔值。如果为 True(默认),则先遍历顶层目录,再遍历子目录。如果为 False,则先遍历子目录,再遍历顶层目录。

  • onerror:可选参数,如果指定,遇到错误时会调用该函数(通常是权限错误)。

  • followlinks:可选参数,布尔值。如果为 True,会跟随目录中的符号链接(软链接)。

返回值

os.walk() 返回一个生成器对象,每次迭代会生成一个 (dirpath, dirnames, filenames) 元组,其中:

  • dirpath:当前遍历到的目录路径(字符串)。

  • dirnames:当前目录下的子目录名称列表。

  • filenames:当前目录下的文件名称列表。

>>> for foldername, subfolders, filenames in os.walk(Path.cwd()):
...     print(f"----------当前目录:{foldername}----------")      
...     print(f"子文件夹是:{subfolders}")
...     print(f"文  件  是:{filenames}")
... 
----------当前目录:C:\Users\yx\Desktop\folderA----------
子文件夹是:['.git', '.venv', 'folderC', '__pycache__']
文  件  是:['.gitignore', '.python-version', 'a.txt', 'b.txt', 'helloworld.py', 'main.ipynb', 'main.py', 'mycats.py', 'mydata', 'pyproject.toml', 'README.md', 'uv.lock']
----------当前目录:C:\Users\yx\Desktop\folderA\.git----------
子文件夹是:['hooks', 'info', 'objects', 'refs']
文  件  是:['config', 'description', 'FETCH_HEAD', 'HEAD']
----------当前目录:C:\Users\yx\Desktop\folderA\.git\hooks----------
子文件夹是:[]
文  件  是:['applypatch-msg.sample', 'commit-msg.sample', 'fsmonitor-watchman.sample', 'post-update.sample', 'pre-applypatch.sample', 'pre-commit.sample', 'pre-merge-commit.sample', 'pre-push.sample', 'pre-rebase.sample', 'pre-receive.sample', 'prepare-commit-msg.sample', 'push-to-checkout.sample', 'sendemail-validate.sample', 'update.sample']
----------当前目录:C:\Users\yx\Desktop\folderA\.git\info----------
子文件夹是:[]
文  件  是:['exclude']
----------当前目录:C:\Users\yx\Desktop\folderA\.git\objects----------
子文件夹是:['info', 'pack']
文  件  是:[]
----------当前目录:C:\Users\yx\Desktop\folderA\.git\objects\info----------
子文件夹是:[]
文  件  是:[]
----------当前目录:C:\Users\yx\Desktop\folderA\.git\objects\pack----------
子文件夹是:[]
文  件  是:[]
----------当前目录:C:\Users\yx\Desktop\folderA\.git\refs----------
子文件夹是:['heads', 'tags']
文  件  是:[]
----------当前目录:C:\Users\yx\Desktop\folderA\.git\refs\heads----------
子文件夹是:[]
文  件  是:[]
----------当前目录:C:\Users\yx\Desktop\folderA\.git\refs\tags----------
子文件夹是:[]
文  件  是:[]
----------当前目录:C:\Users\yx\Desktop\folderA\.venv----------
子文件夹是:['Lib', 'Scripts']
文  件  是:['.gitignore', '.lock', 'CACHEDIR.TAG', 'pyvenv.cfg']
----------当前目录:C:\Users\yx\Desktop\folderA\.venv\Lib----------
子文件夹是:['site-packages']
文  件  是:[]
----------当前目录:C:\Users\yx\Desktop\folderA\.venv\Lib\site-packages----------
子文件夹是:['send2trash', 'Send2Trash-1.8.3.dist-info', '__pycache__']
文  件  是:['_virtualenv.pth', '_virtualenv.py']
----------当前目录:C:\Users\yx\Desktop\folderA\.venv\Lib\site-packages\send2trash----------
子文件夹是:['mac', 'win', '__pycache__']
文  件  是:['compat.py', 'exceptions.py', 'plat_gio.py', 'plat_other.py', 'util.py', '__init__.py', '__main__.py']
----------当前目录:C:\Users\yx\Desktop\folderA\.venv\Lib\site-packages\send2trash\mac----------
子文件夹是:[]
文  件  是:['legacy.py', 'modern.py', '__init__.py']
----------当前目录:C:\Users\yx\Desktop\folderA\.venv\Lib\site-packages\send2trash\win----------
子文件夹是:['__pycache__']
文  件  是:['IFileOperationProgressSink.py', 'legacy.py', 'modern.py', '__init__.py']
----------当前目录:C:\Users\yx\Desktop\folderA\.venv\Lib\site-packages\send2trash\win\__pycache__----------
子文件夹是:[]
文  件  是:['legacy.cpython-311.pyc', 'modern.cpython-311.pyc', '__init__.cpython-311.pyc']
----------当前目录:C:\Users\yx\Desktop\folderA\.venv\Lib\site-packages\send2trash\__pycache__----------
子文件夹是:[]
文  件  是:['compat.cpython-311.pyc', 'exceptions.cpython-311.pyc', 'util.cpython-311.pyc', '__init__.cpython-311.pyc']
----------当前目录:C:\Users\yx\Desktop\folderA\.venv\Lib\site-packages\Send2Trash-1.8.3.dist-info----------
子文件夹是:[]
文  件  是:['entry_points.txt', 'INSTALLER', 'LICENSE', 'METADATA', 'RECORD', 'REQUESTED', 'top_level.txt', 'WHEEL']
----------当前目录:C:\Users\yx\Desktop\folderA\.venv\Lib\site-packages\__pycache__----------
子文件夹是:[]
文  件  是:['_virtualenv.cpython-311.pyc']
----------当前目录:C:\Users\yx\Desktop\folderA\.venv\Scripts----------
子文件夹是:[]
文  件  是:['activate', 'activate.bat', 'activate.csh', 'activate.fish', 'activate.nu', 'activate.ps1', 'activate_this.py', 'deactivate.bat', 'pydoc.bat', 'python.exe', 'pythonw.exe', 'send2trash.exe']
----------当前目录:C:\Users\yx\Desktop\folderA\folderC----------
子文件夹是:['folderD', 'folderE']
文  件  是:['a.txt', 'new_b.txt']
----------当前目录:C:\Users\yx\Desktop\folderA\folderC\folderD----------
子文件夹是:[]
文  件  是:['a.py', 'b.py']
----------当前目录:C:\Users\yx\Desktop\folderA\folderC\folderE----------
子文件夹是:['folderE1']
文  件  是:['c.py', 'd.py']
----------当前目录:C:\Users\yx\Desktop\folderA\folderC\folderE\folderE1----------
子文件夹是:[]
文  件  是:['f.py']
----------当前目录:C:\Users\yx\Desktop\folderA\__pycache__----------
子文件夹是:[]
文  件  是:['mycats.cpython-313.pyc']