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.
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 '.'
.
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())
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
filter( lambda f: not f.startswith('.'), os.listdir('.'))
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
.)
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')
filenames = (f.name for f in os.scandir() if not f.name.startswith('.'))