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
查看 chmod
和 chown
手册以获取更多信息。
我正在尝试使用 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
查看 chmod
和 chown
手册以获取更多信息。