>>> from env_helper import info; info()
页面更新时间: 2023-06-30 19:18:41
运行环境:
    Linux发行版本: Debian GNU/Linux 12 (bookworm)
    操作系统内核: Linux-6.1.0-9-amd64-x86_64-with-glibc2.36
    Python版本: 3.11.2

3.2. 使用 os 模块遍历目录树

os 模块中有一些工具可以用来进行文件访问与管理。这些功能目前可以使用 pathlib 模块替代,但在一些地方可能会看到。

这里有一个例子程序,针对目录树的遍历,使用了 os.walk() 函数:

>>> import os
>>>
>>> for folderName, subfolders, filenames in os.walk('/tmp/'):
>>>     print('The current folder is ' + folderName)
>>>
>>>     for subfolder in subfolders:
>>>         print('SUBFOLDER OF ' + folderName + ': ' + subfolder)
>>>     for filename in filenames:
>>>         print('FILE INSIDE ' + folderName + ': ' + filename)
>>>
>>>     print('-' * 10)
The current folder is /tmp/
SUBFOLDER OF /tmp/: .font-unix
SUBFOLDER OF /tmp/: .ICE-unix
SUBFOLDER OF /tmp/: .XIM-unix
SUBFOLDER OF /tmp/: systemd-private-54f54cfd8d674fe3a380db88f52ee48b-jupyterhub.service-K5DGMw
SUBFOLDER OF /tmp/: systemd-private-54f54cfd8d674fe3a380db88f52ee48b-systemd-logind.service-deYF8o
SUBFOLDER OF /tmp/: systemd-private-54f54cfd8d674fe3a380db88f52ee48b-ModemManager.service-mdN7B2
SUBFOLDER OF /tmp/: .X11-unix
SUBFOLDER OF /tmp/: systemd-private-54f54cfd8d674fe3a380db88f52ee48b-chrony.service-CM629B
SUBFOLDER OF /tmp/: systemd-private-54f54cfd8d674fe3a380db88f52ee48b-apache2.service-CW9Tb8
FILE INSIDE /tmp/: aliyun_assist_service.sock
FILE INSIDE /tmp/: AliyunAssistClientSingleLock.lock
----------
The current folder is /tmp/.font-unix
----------
The current folder is /tmp/.ICE-unix
----------
The current folder is /tmp/.XIM-unix
----------
The current folder is /tmp/.X11-unix
----------

os.walk() 函数被传入一个字符串值,即一个文件夹的路径。 你可以在一个 for 循环语句中使用 os.walk() 函数, 遍历目录树,就像使用 range() 函数遍历一个范围的数字一样。 不像 range()os.walk() 在循环的每次迭代中,返回3个值:

  • 当前文件夹名称的字符串。

  • 当前文件夹中子文件夹的字符串的列表。

  • 当前文件夹中文件的字符串的列表。

所谓当前文件夹,是指 for 循环当前迭代的文件夹。 程序的当前工作目录,不会因为 os.walk() 而改变。

就像你可以在代码 for i in range(lO): 中选择变量名称 i 一样,你也可以选择前面列出来的3个字的变量名称。 我通常使用 foldemamesubfoldersfilenames

因为 os.walk() 返回字符串的列表, 保存在 subfolderfilename 变量中, 所以你可以在它们自己的 for 循环中使用这些列表。 用你自己定制的代码,取代 print() 函数调用 (或者如果不需要,就删除 for 循环)。