os.fwalk() 的 dir_fd 参数有什么作用?

问题描述

如果我为 dir_fdos.fwalk() 参数分配一个整数,则第四个值被添加list(os.fwalk()) 生成的每个元组中。

我知道它们与组织文件和目录的层次结构有关,但我不太明白它们的确切含义。

此外,根据分配给 dir_fd 的整数,这些值也会发生变化,并且总是缺少一个数字(在本例中为 82,见下文)。

有什么想法吗?

代码

import os

os.chdir("/home/test")
inp = str(os.getcwd() + "/input")

l = list(os.fwalk(inp,dir_fd=3))

输出

[('/home/test/input',['a','b','c'],['d.txt'],80),('/home/test/input/a',['aa'],['ac.txt','ab.txt'],81),('/home/test/input/a/aa',[],83),('/home/test/input/b',['bb.txt','bc.txt','ba.txt'],('/home/test/input/c',['ca'],('/home/test/input/c/ca',['caa'],['cab.txt'],('/home/test/input/c/ca/caa',['caaa.txt'],84)]

解决方法

dir_fddocumentation 位置混乱。这是它所说的:

相对于目录描述符的路径:如果dir_fd不是None,它应该是一个引用目录的文件描述符,以及要操作的路径应该是相对的;然后路径将相对于该目录。如果路径是绝对路径,则忽略 dir_fd。 (对于 POSIX 系统,Python 将调用带有 at 后缀并可能带有 f 前缀的函数变体(例如调用 faccessat 而不是 access)。

您可以使用 os.supports_dir_fd 检查您平台上的特定功能是否支持 dir_fd。如果它不可用,使用它会引发 NotImplementedError

因此,如果您传递 dir_fd,那么 fwalk 会将路径参数解释为相对于文件描述符指定的目录。

(听起来您甚至不知道文件描述符是什么。文件描述符是标识打开的文件或目录的整数。您可以使用 os.open 或其他一些方法来获取。在这里使用文件描述符而不是路径的优点是,即使内容被移动或重命名,文件描述符仍然有效,从而使旧路径无效。)