2 votes

Glob, mais ne pas ignorer "permission denied"

En Python, glob ignore les erreurs "Permission denied". Malheureusement, j'ai besoin de savoir s'il y avait un répertoire que je ne pouvais pas lire.

Je pourrais utiliser os.walk() et fnmatch, mais peut-être qu'il y a une meilleure solution?

Exemple:

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

Il y a des fichiers dans /root, mais user@pc n'est pas autorisé à lire ce répertoire.

Une seule exception ne serait pas suffisante. Par exemple glob.glob('/var/log/*/*.log'). Je veux savoir quels répertoires existent, mais sont illisibles.

3voto

jcollado Points 18325

Une façon d'obtenir tous les répertoires et fichiers qui ne peuvent pas être lus est effectivement d'utiliser os.walk pour parcourir de manière récursive une arborescence de répertoires et ensuite, pour chaque répertoire et fichier, vérifier les autorisations en utilisant 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 'Répertoires illisibles :\n{0}'.format('\n'.join(unreadable_dirs))
print 'Fichiers illisibles :\n{0}'.format('\n'.join(unreadable_files))

Note : Vous pourriez écrire votre propre fonction récursive qui parcourt la structure des répertoires, mais vous duplicerez essentiellement la fonctionnalité de os.walk, donc je ne vois pas le cas d'utilisation pour glob.glob.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X