【发布时间】:2017-07-15 15:36:40
【问题描述】:
我正在尝试使用 os.listdir 来获取子目录列表,但是当我缺少这些子目录之一的权限时遇到了问题。我不能获得许可,所以我想尽可能优雅地继续。理想情况下,我可以忽略任何我无权访问的目录并返回任何其他目录,以免错过任何子目录。
我曾尝试使用 os.walk,但遇到了许多其他问题(包括性能)并决定不使用它。
一个例子。根目录下有3个孩子,a,b,c
root dir
|
----> dir a
|
----> dir b
|
----> dir c
我对 a 和 c 有权限,但对 b 没有权限(事先不知道)。我想返回 [a, c]
这是一些概括的代码-
def get_immediate_subdirectories(directory):
"""Returns list of all subdirectories in
directory
Args:
directory: path to directory
Returns:
List of child directories in directory excluding
directories in exclude and any symbolic links
"""
exclude = ["some", "example", "excluded", "dirnames"]
sub_dirs = []
try:
all_files = os.listdir(directory)
except OSError:
# **Ideally I'd be able to recover some list here/continue**
for name in all_files:
if name in exclude:
continue
full_path = os.path.join(directory, name)
if os.path.isdir(full_path):
# Keep these separate to avoid issue
if not os.path.islink(full_path):
sub_dirs.append(name)
return sub_dirs
【问题讨论】:
-
listdir()在遇到您无法读取的单个文件时不会失败 - 只有在您正在阅读的目录中没有+r时才会失败,或者+x在它的父母身上;其中文件或目录的权限无关紧要。 -
...所以,如果您从
os.listdir()收到 OSError,则没有什么可恢复的——如果您的目录中没有+r,您将无权读取 任何它的内容。 -
关于
os.path.isdir()和os.path.islink(),顺便说一句,它们都只使用系统调用stat(2);在 MacOS 上,可能导致EACCES的唯一方法是,如果目录 holding 的路径的一个组件没有+x- 所以如果你有+r但没有目录上的+x,那么listdir()会成功,但其内容上的os.path.isdir()会失败。
标签: python python-2.7 python-os