python - 使用 os.walk 避免无限递归

标签 python recursion os.walk

我将 os.walkfollowlinks=True 一起使用,但我遇到了一个符号链接(symbolic link)指向它自己的目录的地方,导致无限循环。这种情况下的罪魁祸首是 /usr/bin/X11 列表如下:

lrwxrwxrwx 1 root root           1 Apr 24  2015 X11 -> .

有什么方法可以避免跟踪到 ... 的链接,我认为这会导致类似的问题?我想我可以使用 os.readlink 检查它,然后与当前路径进行比较。还有其他解决方案吗?

最佳答案

如果您想避免递归,就无法避免存储一组所有访问过的目录。您不需要使用 readlink,但是,您可以只存储 inode 。这完全避免了路径规范化的问题。

import os
dirs = set()
for dirpath, dirnames, filenames in os.walk('.', followlinks=True):
    st = os.stat(dirpath)
    scandirs = []
    for dirname in dirnames:
        st = os.stat(os.path.join(dirpath, dirname))
        dirkey = st.st_dev, st.st_ino
        if dirkey not in dirs:
            dirs.add(dirkey)
            scandirs.append(dirname)
    dirnames[:] = scandirs
    print(dirpath)

关于python - 使用 os.walk 避免无限递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36977259/

相关文章:

java - 如何使用递归回溯 (Java) 找到特定迷宫的解决方案?

recursion - 迭代是递归吗?

Python:无法在我的代码中找到错误。 os.walk() 返回的文件名

python - 将文件从一个文件夹复制到另一个文件夹(并且不覆盖)

python - 在 Python 中读取异步标准输入

Python如何根据文件内容创建UUID

python - 我在 Python 中遇到此错误,EnvironmentNotWritable 错误

python - 具有稀疏矩阵的 bool 索引 Numpy 数组

Java如何迭代递归地查找链表中的值

python - 使用 os.walk 读取文件