web-dev-qa-db-fra.com

Comment ignorer les fichiers cachés en utilisant os.listdir ()?

Mon script python exécute une os.listdir(path) où le chemin est une file d'attente contenant des archives que je dois traiter une par une.

Le problème est que j'obtiens la liste dans un tableau et que je fais simplement une simple array.pop(0). Cela fonctionnait bien jusqu'à ce que je mette le projet dans Subversion. Maintenant, je reçois le dossier .svn Dans mon tableau et bien sûr, cela fait planter mon application.

Voici donc ma question: existe-t-il une fonction existante qui ignore les fichiers cachés lors de l'exécution d'une os.listdir() et sinon quelle serait la meilleure façon?

Merci.

68
talnicolas

Vous pouvez en écrire un vous-même:

def listdir_nohidden(path):
    for f in os.listdir(path):
        if not f.startswith('.'):
            yield f

Ou vous pouvez utiliser un glob :

def listdir_nohidden(path):
    return glob.glob(os.path.join(path, '*'))

L'un ou l'autre ignorera tous les noms de fichiers commençant par '.'.

79
Adam Rosenfield

C'est une vieille question, mais il semble qu'il manque la réponse évidente de l'utilisation de la compréhension de liste, donc je l'ajoute ici pour être complet:

[f for f in os.listdir(path) if not f.startswith('.')]

En guise de remarque, l'état des documents listdir renverra les résultats dans un "ordre arbitraire", mais un cas d'utilisation courant consiste à les trier par ordre alphabétique. Si vous souhaitez que le contenu du répertoire soit trié par ordre alphabétique sans égard à la capitalisation, vous pouvez utiliser:

sorted([f for f in os.listdir('./')], key=lambda f: f.lower())
29
Joshmaker

Sous Windows, Linux et OS X:

if os.name == 'nt':
    import win32api, win32con


def folder_is_hidden(p):
    if os.name== 'nt':
        attribute = win32api.GetFileAttributes(p)
        return attribute & (win32con.FILE_ATTRIBUTE_HIDDEN | win32con.FILE_ATTRIBUTE_SYSTEM)
    else:
        return p.startswith('.') #linux-osx
16
cle
filter( lambda f: not f.startswith('.'), os.listdir('.'))
12
scum

glob :

>>> import glob
>>> glob.glob('*')

(glob prétend utiliser listdir et fnmatch sous le capot, mais il vérifie également la présence d'un '.', pas en utilisant fnmatch.)

11
Josh Lee

Je pense que c'est trop de travail de parcourir tous les éléments en boucle. Je préférerais quelque chose de plus simple comme ceci:

lst = os.listdir(path)
if '.DS_Store' in lst:
    lst.remove('.DS_Store')

Si le répertoire contient plusieurs fichiers cachés, cela peut aider:

all_files = os.popen('ls -1').read()
lst = all_files.split('\n')
6
user 923227
filenames = (f.name for f in os.scandir() if not f.name.startswith('.'))
1
amenbo