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.

slam_duncan
la source

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)

la paresse
la source
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.
mgilson
la source
20
import os

destdir = '/var/tmp/testdir'

files = [ f for f in os.listdir(destdir) if os.path.isfile(os.path.join(destdir,f)) ]
Nasimuddin Ansari
la source
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() .

prasastoadi
la source
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.

2114L3
la source
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
Ozgur Oz
la source
3

au lieu de os.walk, utilisez simplementos.listdir

Inbar Rose
la source
1

Vous pouvez utiliser le module pathlib.

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