我有一个目录,其中包含一些文件,一些目录,一些文件的符号链接和一些指向目录的符号链接。
当我在目录中使用 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)
如果突然在文件中出现指向目录的符号链接,这将 破。所以我不相信值得改变这一点。指向 目录并不比目录更接近文件,它真的 取决于用例。