Lister les fichiers UNIQUEMENT dans le répertoire courant


226

En Python, je veux uniquement répertorier tous les fichiers du répertoire actuel. Je ne veux pas que les fichiers soient répertoriés dans un sous-répertoire ou un parent.

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

import os
for subdir, dirs, files in os.walk('./'):
    for file in files:
      do some stuff
      print file

Supposons que j'ai 2 fichiers, holygrail.py et Tim dans mon répertoire actuel. J'ai également un dossier et il 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 content avec holygrail.py et Tim. Mais les deux fichiers, Arthur et Lancelot, je ne veux pas les lister.

Réponses:


379

Utilisez simplement os.listdiret os.path.isfileau 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 soyez prudent lorsque vous l'appliquez à un autre répertoire, comme

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

ce qui ne fonctionnerait pas car ce fn'est pas un chemin complet mais relatif au répertoire courant.

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

(Merci Causalité pour l'indice)


3
C'est ce dont j'avais besoin à la fin[os.path.join(path_base,f) for f in os.listdir(path_base) if os.path.isfile(os.path.join(path_base,f))]
citynorman

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

64

Vous pouvez utiliser os.listdirà cette fin. Si vous souhaitez uniquement des fichiers et non des répertoires , vous pouvez filtrer les résultats à l'aide de os.path.isfile.

exemple:

files = os.listdir(os.curdir)  #files and directories

ou

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

20
import os

destdir = '/var/tmp/testdir'

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

3
Merci d'avoir donné la solution générale (dans le cas où le dir n'est pas le cwd).
jwg

10

Vous pouvez utiliser os.scandir(). La nouvelle fonction dans stdlib démarre à 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() met en œuvre os.scandir() .


5

cela peut être fait avec os.walk ()

python 3.5.2 testé;

import os
for root, dirs, files in os.walk('.', topdown=True):
    dirs.clear() #with topdown true, this will prevent walk from going into subs
    for file in files:
      #do some stuff
      print(file)

supprimez la ligne dirs.clear () et les fichiers des sous-dossiers sont à nouveau inclus.

mise à jour avec références ;

os.walk est documenté ici et parle de la triple liste en cours de création et des effets topdown.

.clear () documenté ici pour vider une liste

ainsi, en effaçant la liste pertinente d'os.walk, vous pouvez affecter son résultat à vos besoins.


4
import os
for subdir, dirs, files in os.walk('./'):
    for file in files:
      do some stuff
      print file

Vous pouvez améliorer ce code del dirs[:]qui sera comme suit.

import os
for subdir, dirs, files in os.walk('./'):
    del dirs[:]
    for file in files:
      do some stuff
      print file

Ou encore mieux si vous pouviez pointer os.walk avec le répertoire de travail actuel.

import os
cwd = os.getcwd()
for subdir, dirs, files in os.walk(cwd, topdown=True):
    del dirs[:]  # remove the sub directories.
    for file in files:
      do some stuff
      print file


1

Vous pouvez utiliser le module pathlib.

from pathlib import Path
x = Path('./')
print(list(filter(lambda y:y.is_file(), x.iterdir())))
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.