os.walk() 是否缺少指向目录的符号链接



我有一个目录,其中包含一些文件,一些目录,一些文件的符号链接和一些指向目录的符号链接。

当我在目录中使用 followlinks=false 执行 os.walk() 时,我获得了文件名列表中的文件和符号链接以及目录列表中的目录。但是目录的符号链接不会显示在任何地方。这是 Python 中的错误或功能,还是我做错了什么?

我希望目录的符号链接显示在文件名列表中,因为它们不是目录而是符号链接,而其他符号链接(指向其他文件)显示在文件名列表中。

例:目录 foo 包含以下内容:

-rw-rw-r-- 4 rikno staff 136 Jan 14 11:10 firefox
lrwxr-xr-x 1 rikno staff   5 Jan 23 13:29 latex -> tetex
lrwxr-xr-x 2 rikno staff  68 Jan 14 11:10 mozilla -> firefox
drwxrwxr-x 3 rikno staff 102 Jan 23 13:29 tetex

我希望第一次迭代中的os.walk('foo')返回

('foo', ['tetex'], ['firefox', 'latex', 'mozilla'])

或至少

('foo', ['latex', 'tetex'], ['firefox', 'mozilla'])

但我得到的只是

('foo', ['tetex'], ['firefox', 'mozilla'])

而且我从来没有得到任何关于符号链接乳胶的信息(它指向目录 tetex)

解决:

好的,结果

('foo', ['latex', 'tetex'], ['firefox', 'mozilla'])

因此,目录的符号链接显示在目录列表中。

最初期望指向目录的符号链接在文件名列表中,但从未在目录列表中查找,并且在尝试代码和文件系统以查找链接的位置或链接"丢失"的原因时,我不小心混淆了我的结果。

抱歉问。

你写道,你调用了os.walk()followlinks设置为 False 。那么,这就是预期的行为:

默认情况下,walk()不会进入解析的符号链接 到目录。将followlinks设置为True以访问指向的目录 通过符号链接,在支持它们的系统上。

在我的机器上运行,os.walk()确实显示了所有符号链接:

>>> os.walk("foo").next()
('foo', ['tetex', 'latex'], ['mozilla', 'firefox'])
>>> os.walk("foo", followlinks=False).next()
('foo', ['tetex', 'latex'], ['mozilla', 'firefox'])

我在这里看到的唯一"问题"是符号链接出现在目录列表中,而不是文件列表中。

在大多数用例中,这将是预期的行为,因为人们希望能够将文件列表中的所有条目视为文件,而不必检查它是否是符号链接。

这个来自python-dev的线程简要讨论了这个问题。

"...将符号链接到目录 进入文件列表而不是子目录列表实际上没有任何 更好(它只是将问题转移到不同的用例,例如 那些真正想要读取文件内容的人)。

并从链接的问题页面:

"例如,计算 目录,代码可以如下所示:

for root, dirs, files in os.walk(top):
    for file in files:
        f = open(file)
        for n, l in enumerate(f, 1):
            pass
        print(file, n)

如果突然在文件中出现指向目录的符号链接,这将 破。所以我不相信值得改变这一点。指向 目录并不比目录更接近文件,它真的 取决于用例。

相关内容

  • 没有找到相关文章