2

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

当我在目录中使用 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 列表中。

我首先期望目录的符号链接在文件名列表中,并且从未查看过目录名列表,并且在尝试使用代码和文件系统来查找链接的位置或链接“丢失”的原因时,我不小心弄混了我的结果。

抱歉问了。

4

2 回答 2

2

您写道,您os.walk()使用followlinksset to调用False。那么,这就是预期的行为

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

于 2013-01-23T15:30:30.910 回答
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 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)

如果文件中突然出现了指向目录的符号链接,则会中断。所以我不相信值得改变这一点。指向目录的符号链接与文件的距离并不比与目录的距离更近,它实际上取决于用例。”

于 2013-01-23T15:56:06.110 回答