python os.listdir击中OSError:[Errno 13]权限被拒绝

时间:2017-02-24 17:31:27

标签: python python-2.7 python-os

我试图使用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

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

浏览目录,检查您是否先访问:

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

答案 2 :(得分:0)

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

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

如果它不起作用,请运行:

$ sudo chmod -r 777 directory

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