python os.listdir hitting OSError: [Errno 13] Permission denied

python os.listdir hitting OSError: [Errno 13] Permission denied

我正在尝试使用 os.listdir 来获取子目录列表,但是当我缺少其中一个子目录的权限时 运行 遇到了问题。我可以获得许可,所以我想尽可能优雅地继续。理想情况下,我可以忽略任何我没有权限的目录和 return 任何其他目录,以免错过任何 child 目录。

我试过使用 os.walk 但我 运行 遇到许多其他问题(包括性能)并决定不使用它。

一个例子。根目录下有3个children,a,b,c

root dir
|
----> dir a 
|
----> dir b
|
----> dir c

我有 a 和 c 但没有 b 的权限(提前不知道)。我想 return [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

遍历目录,先检查您是否有访问权限:

for (dirpath, dirnames, filenames) in os.walk('/path/to/folder'):
    for dir in dirnames:
        path = os.path.join(dirpath, dir)
        read_write = os.access(path, os.W_OK) and os.access(path, os.R_OK)
        # W_OK write True and R_OK read True
        if not read_write:
            continue

参见:Determining Whether a Directory is Writeable

这个问题中的假设——目录中途的不可读条目可能导致 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'

您必须更改文件的所有权:

$ sudo chown -R <userwhorunpython>:<userwhorunpython> <yourdirectory> 

如果不行,运行答:

$ sudo chmod -r 777 directory

查看 chmodchown 手册以获取更多信息。