glob, но не игнорируйте отказ в разрешении

в Python glob игнорирует ошибки «Отказано в доступе». К сожалению, мне нужно знать, был ли каталог, который я не могу прочитать.

Я мог бы использовать os.walk() и fnmatch, но, может быть, есть лучшее решение?

Пример:

user@pc:~
===> python
>>> import glob
>>> glob.glob('/root/*')
[]

В /root есть файлы, но пользователю @pc не разрешено читать этот каталог.

Одного исключения будет недостаточно. Например glob.glob('/var/log/*/*.log'). Я хочу знать, какие каталоги существуют, но не читаются.


person guettli    schedule 12.01.2012    source источник
comment
Как вы думаете, какое разрешение игнорируется (чтение, запись, выполнение)? Вам просто нужно проверить, существует ли данное имя каталога?   -  person jcollado    schedule 12.01.2012
comment
Я добавил пример к вопросу.   -  person guettli    schedule 12.01.2012


Ответы (1)


Один из способов получить все каталоги и файлы, которые невозможно прочитать, — это действительно использовать 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.

person jcollado    schedule 12.01.2012