1

我正在尝试使用 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
4

3 回答 3

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'
于 2017-02-24T18:02:19.727 回答
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

请参阅:确定目录是否可写

于 2017-02-24T17:48:39.597 回答
0

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

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

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

$ sudo chmod -r 777 directory

查看chmodchown手册了解更多信息。

于 2017-07-01T19:55:54.873 回答