glob,但不忽略“权限 denied”
在Python中,使用glob这个工具时,它会忽略“权限被拒绝”的错误。可惜的是,我需要知道是否有我无法读取的目录。
我可以使用os.walk()和fnmatch来解决这个问题,但也许还有更好的办法?
举个例子:
user@pc:~
===> python
>>> import glob
>>> glob.glob('/root/*')
[]
/root目录下有一些文件,但用户user@pc没有权限读取这个目录。
仅仅知道一个异常是不够的。比如说使用glob.glob('/var/log/*/*.log')
这个命令。我想知道哪些目录是存在的,但我无法访问。
1 个回答
3
一种获取所有无法读取的目录和文件的方法是使用 os.walk
来递归遍历一个目录树。然后,对于每个目录和文件,使用 os.access
来检查它们的权限。
import os
unreadable_dirs = []
unreadable_files = []
for dirpath, dirnames, filenames in os.walk('/var/log'):
for dirname in dirnames:
dirname = os.path.join(dirpath, dirname)
if not os.access(dirname, os.R_OK):
unreadable_dirs.append(dirname)
for filename in filenames:
filename = os.path.join(dirpath, filename)
if not os.access(filename, os.R_OK):
unreadable_files.append(filename)
print 'Unreadable directories:\n{0}'.format('\n'.join(unreadable_dirs))
print 'Unreadable files:\n{0}'.format('\n'.join(unreadable_files))
注意:你可以自己写一个递归函数来遍历目录结构,但这样其实就是在重复 os.walk
的功能,所以我觉得没有必要使用 glob.glob
。