303 votes

Lister les fichiers UNIQUEMENT dans le répertoire actuel

En Python, je veux seulement répertorier tous les fichiers dans le répertoire actuel UNIQUEMENT. Je ne veux pas les fichiers répertoriés depuis un sous-répertoire ou depuis le répertoire parent.

Il semble y avoir des solutions similaires disponibles, mais elles ne semblent pas fonctionner pour moi. Voici un extrait de mon code :

import os
for subdir, dirs, files in os.walk('./'):
    for file in files:
      faire quelque chose
      print fichier

Supposons que j'ai 2 fichiers, holygrail.py et Tim dans mon répertoire actuel. J'ai également un dossier qui contient deux fichiers - appelons-les Arthur et Lancelot - à l'intérieur. Lorsque j'exécute le script, voici ce que j'obtiens :

holygrail.py
Tim
Arthur
Lancelot

Je suis satisfait de holygrail.py et Tim. Mais les deux fichiers, Arthur et Lancelot, je ne veux pas qu'ils soient répertoriés.

501voto

sloth Points 40517

Utilisez simplement os.listdir et os.path.isfile au lieu de os.walk.

Exemple:

import os
files = [f for f in os.listdir('.') if os.path.isfile(f)]
for f in files:
    # do something

Mais faites attention lorsque vous appliquez ceci à un autre répertoire, comme

files = [f for f in os.listdir(somedir) if os.path.isfile(f)]

ce qui ne fonctionnerait pas car f n'est pas un chemin complet mais relatif au répertoire actuel.

Par conséquent, pour filtrer sur un autre répertoire, utilisez os.path.isfile(os.path.join(somedir, f))

(Merci à Causality pour l'astuce)

8 votes

Voici ce dont j'avais besoin à la fin [os.path.join(chemin_base,f) for f in os.listdir(chemin_base) if os.path.isfile(os.path.join(chemin_base,f))]

4 votes

Voici sa réponse : fichiers = [f for f in os.listdir("/somedir") if os.path.isfile(os.path.join("/somedir", f))]

85voto

mgilson Points 92954

Vous pouvez utiliser os.listdir à cette fin. Si vous ne voulez que les fichiers et non les répertoires, vous pouvez filtrer les résultats en utilisant os.path.isfile.

exemple:

files = os.listdir(os.curdir)  # fichiers et répertoires

ou

files = filter(os.path.isfile, os.listdir( os.curdir ) )  # fichiers seulement
files = [ f for f in os.listdir( os.curdir ) if os.path.isfile(f) ] # version avec list comprehension.

0 votes

Je pense que la version du filtre fonctionne uniquement si c'est curdir. Par exemple, cela ne fonctionnera pas pour files = filter(os.path.isfile, os.listdir(anyFolderPath))?

28voto

user3558690 Points 43
import os

destdir = '/var/tmp/testdir'

fichiers = [f for f in os.listdir(destdir) if os.path.isfile(os.path.join(destdir, f))]

4 votes

Merci d'avoir fourni la solution générale (dans le cas où le répertoire n'est pas le répertoire de travail).

19voto

prasastoadi Points 196

Vous pouvez utiliser [os.scandir()](https://docs.python.org/3/library/os.html#os.scandir). Nouvelle fonction dans stdlib à partir de Python 3.5.

import os

for entry in os.scandir('.'):
    if entry.is_file():
        print(entry.name)

Plus rapide que os.listdir(). os.walk() implémente os.scandir().

15voto

Pygirl Points 358

Vous pouvez utiliser le module pathlib.

from pathlib import Path
x = Path('./')
print(list(filter(lambda y:y.is_file(), x.iterdir())))

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