os.walk()是否缺少对目录符号链接的支持?

3
我有一个目录,其中包含一些文件、一些目录、一些指向文件的符号链接和一些指向目录的符号链接。
当我在该目录中使用followlinks=false参数执行os.walk()函数时,文件和符号链接显示在filenames列表中,而目录显示在dirnames列表中。但是,指向目录的符号链接没有出现在任何地方。这是Python中的一个bug还是特性,还是我做错了什么?
我期望指向目录的符号链接出现在filenames列表中,因为它们不是目录,而是符号链接,而其他符号链接(指向其他文件)出现在filenames列表中。
例如: 目录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'])

我从未收到关于符号链接latex(指向目录tetex)的任何信息。

已解决:

好的,结果

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

所以文件夹的符号链接显示在目录名称列表中。
一开始,我预期文件夹的符号链接会出现在文件名列表中,没有查看目录名称列表。当我试着通过代码和文件系统找到链接的位置或者为什么链接“丢失”时,我不小心混淆了结果。
非常抱歉我的提问。

对我来说,这听起来像是一个疏忽。我想这可以理解为一个 bug。 - Ignacio Vazquez-Abrams
我似乎无法重现你的问题。 运行os.walk(“foo”).next()会给我 ('foo',['tetex','latex'],['mozilla','firefox'])。 添加followlinks=False也会报告相同的结果。(我正在使用Python 2.7.3) - Shawn Chin
抱歉,在测试时我弄混了我的结果。它确实显示在dirnames列表中。 - Exostor
2个回答

3
您写道使用False调用os.walk()followlinks。那么这就是预期的行为
默认情况下,walk()不会进入解析为目录的符号链接。在支持符号链接的系统上,将followlinks设置为True可以访问由符号链接指向的目录。

当然可以,但为什么它没有报告它们呢? - Ignacio Vazquez-Abrams
没错。我不希望它进入符号链接所指向的目录,但我希望它列出符号链接本身。 - Exostor
在使用 os.walk() 查找目录时,如何跳过符号链接? - readytotaste

2
在我的电脑上运行,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 example to count the number of lines of all the files under a directory, a code could go like this:

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)

If, suddently, a symlink to a directory appeared in files, this will break. So I'm not convinced it's worth changing this. A symlink to a directory is not much closer to a file than to a directory, it really depends on the use case."


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接