使用pathlib的rglob

时间:2015-05-07 11:36:25

标签: python permissions pathlib

我正在尝试使用pathlib递归遍历和/或查找文件。由于文件系统管理不善而无法控制文件权限和组。

当我缺少rglob尝试进入的目录的权限和组成员身份时,会出现问题。 Rglob抛出一个KeyError,然后抛出一个PermissionError,最后完全停止。我看不出从这里优雅地恢复并继续全球化。

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

更多细节:

Python:3.4.1从源代码编译为linux

Filesystem我是通过以下方式实现的:automounted nfs share

如何重现:

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)

1 个答案:

答案 0 :(得分: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)在第一个StopIteration之后会引发PermissionError,所以我之后不会收到任何文件。

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