2

我正在尝试使用 pathlib 递归地 glob 和/或查找文件。由于我无法控制的文件系统管理不善,文件权限和组到处都是。

当我缺乏 rglob 尝试进入的目录的权限和组成员身份时,就会出现问题。Rglob 抛出 KeyError 和 PermissionError 并最终完全停止。我认为没有办法从这种情况中优雅地恢复并继续 globbing。

我想要的行为是让 rglob 跳过我没有权限的目录并生成它看到/有权限的所有内容的列表。在这种特殊情况下,全有或全无的性质不会让我走得太远,因为我几乎可以保证每次运行时对某个目录或另一个目录都有错误的权限。

更多细节:

Python:3.4.1 从 linux 源代码编译

我正在使用的文件系统:自动挂载的 nfs 共享

如何重现:

mkdir /tmp/path_test && cd /tmp/path_test && mkdir dir1 dir2 dir2/dir3 && touch dir1/file1 dir1/file2 dir2/file1 dir2/file2 dir2/dir3/file1
su
chmod 700 dir2/dir3/
chown root:root dir2/dir3/
exit

python3.4.1

from pathlib import Path
p = Path('/tmp/path_test')
for x in p.rglob('*') : print(x)
4

1 回答 1

2

起初,我尝试手动迭代这样的结果rglob()

from pathlib import Path
p = Path('/tmp/path_test')
files = p.rglob('*')
while True:
    try:
        f = next(files)
    except (KeyError, PermissionError):
        continue
    except StopIteration:
        break
    print(f)

但它看起来像在第一个之后next(files)抛出 a ,所以在那之后我没有得到任何文件。StopIterationPermissionError

使用os.walk()可能会更好。

于 2015-05-07T17:53:12.297 回答