os.walk()是否缺少符号链接到目录?

时间:2013-01-23 15:25:42

标签: python traversal symlink directory-traversal

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

当我在目录中使用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'])

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

我首先要求目录的符号链接在文件名列表中,并且从不在dirnames列表中查找,并且在试验代码和文件系统时找到链接的位置或链接为什么“丢失”我意外地混淆了我的结果。

很抱歉。

2 个答案:

答案 0 :(得分:2)

您写道,您将os.walk()设为followlinks,并致电False。好吧,那就是expected behavior

  

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

答案 1 :(得分:2)

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

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

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

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

This thread from python-dev简要讨论了这个问题。

  

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

来自linked issue page

  

“例如,计算a下所有文件的行数   目录,代码可以这样:

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)
     

如果,突然,文件中出现了目录的符号链接,这将是   打破。所以我不相信它值得改变它。一个符号链接到   目录与文件相比并不比目录更接近,它确实如此   取决于用例。“