121 votes

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

Mon script python exécute un 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 je récupère la liste dans un tableau et qu'ensuite je fais un simple array.pop(0) . Tout fonctionnait bien jusqu'à ce que je mette le projet en subversion. Maintenant, j'obtiens le message .svn dans mon tableau et, bien sûr, cela fait planter mon application.

Voici donc ma question : existe-t-il une fonction qui ignore les fichiers cachés lors de l'exécution d'un fichier os.listdir() et si ce n'est pas le cas, quelle serait la meilleure façon de procéder ?

137voto

Adam Rosenfield Points 176408

Vous pouvez en rédiger un vous-même :

import os

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

Vous pouvez également utiliser un glob :

import glob
import os

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

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

68voto

Joshmaker Points 964

Il s'agit d'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('.')]

Par ailleurs, la documentation indique que listdir renvoie 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 tenir compte des majuscules, vous pouvez utiliser :

sorted((f for f in os.listdir() if not f.startswith(".")), key=str.lower)

(Modifié pour utiliser key=str.lower au lieu d'un lambda )

29voto

cle Points 31

Sur 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

19voto

scum Points 1511

Joshmaker a la solution à votre question.
Comment ignorer les fichiers cachés en utilisant os.listdir() ?

Dans Python 3 cependant, il est recommandé d'utiliser pathlib au lieu de os.

from pathlib import Path 
visible_files = [
    file for file in Path(".").iterdir() if not file.name.startswith(".")
]

16voto

Josh Lee Points 53741

glob :

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

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

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