我正在尝试使用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
最佳答案
在此问题中做出的假设是错误的,即目录中途的不可读条目可能导致os.listdir()
失败,并且可能导致由其他条目组成的部分结果。
观察:
>>> import os
>>> os.mkdir('unreadable.d')
>>> os.chmod('unreadable.d', 0)
>>> result = os.listdir('.')
>>> print result
['unreadable.d']
它只是尝试在失败的不可读目录本身上运行
listdir()
:>>> os.listdir('unreadable.d')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
OSError: [Errno 13] Permission denied: 'unreadable.d'
关于python - python os.listdir击中OSError:[Errno 13]权限被拒绝,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42444822/