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 j'obtiens la liste dans un tableau et que je fais juste un simple array.pop(0)
. Cela fonctionnait bien jusqu'à ce que je mette le projet en subversion. Maintenant, je reçois le .svn
dossier dans mon tableau et bien sûr cela fait planter mon application.
Alors, voici ma question: y a-t-il une fonction qui ignore les fichiers cachés lors de l'exécution d'un os.listdir()
et sinon quel serait le meilleur moyen?
python
hidden-files
talnicolas
la source
la source
listdir_nohidden
n'est pas tout à fait compatible avecos.listdir
, car l'utilisation de enyield
fait un générateur. Au lieu de cela, il doit parcourir la liste de sortieos.listdir
et supprimer les entrées commençant par «.»list(listdir_nohidden(path))
et avec laquelle cette nouvelle fonction est exactement compatibleos.listdir
.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 complète:
[f for f in os.listdir(path) if not f.startswith('.')]
En remarque, l'état des documents
listdir
renverra les résultats dans un «ordre arbitraire», mais un cas d'utilisation courant consiste à les classer par ordre alphabétique. Si vous voulez 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('./')], key=lambda f: f.lower())
la source
key=lambda f: f.lower()
peut s'écrire sans lambda:key=str.lower
sorted([f for f in os.listdir('./') if not f.startswith('.')], key=str.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
la source
[f for f in os.listdir(path) if not folder_is_hidden(f)]
Joshmaker a la bonne 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(".") ]
la source
glob :
>>> import glob >>> glob.glob('*')
(
glob
prétend utiliserlistdir
etfnmatch
sous le capot, mais il vérifie également un début'.'
, pas en utilisantfnmatch
.)la source
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')
pour l'indépendance de la plate-forme comme @Josh l'a mentionné, le glob fonctionne bien:
import glob glob.glob('*')
la source
.DS_Store
créé automatiquement. Lorsque je compresser tous les fichiers et les envoyer sur un serveur, je les.DS_Store
ajoute également. S'il y a plusieurs fichiers cachés, vous pouvez peut-être essayeros.system('ls -1')
os.popen('ls -1').read()
ne fonctionnera pas sous Windows. C'est tout l'intérêt deos.listdir()
.filenames = (f.name for f in os.scandir() if not f.name.startswith('.'))
la source