Lista archivos SOLAMENTE en el directorio actual

226

En Python, solo quiero enumerar todos los archivos en el directorio actual SOLAMENTE. No quiero que se enumeren archivos de ningún subdirectorio o padre.

Parece que existen soluciones similares, pero no parecen funcionar para mí. Aquí está mi fragmento de código:

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

Supongamos que tengo 2 archivos, holygrail.py y Tim dentro de mi directorio actual. También tengo una carpeta y contiene dos archivos, llamémoslos Arthur y Lancelot, dentro de ella. Cuando ejecuto el script, esto es lo que obtengo:

holygrail.py
Tim
Arthur
Lancelot

Estoy feliz con holygrail.py y Tim. Pero los dos archivos, Arthur y Lancelot, no los quiero en la lista.

slam_duncan
fuente

Respuestas:

379

Solo use os.listdiry en os.path.isfilelugar de os.walk.

Ejemplo:

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

Pero tenga cuidado al aplicar esto a otro directorio, como

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

que no funcionaría porque fno es una ruta completa sino relativa al directorio actual.

Por lo tanto, para filtrar en otro directorio, haga os.path.isfile(os.path.join(somedir, f))

(Gracias a Causality por la pista)

perezoso
fuente
3
Esto es lo que necesitaba al final[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
Esta es su respuesta: files = [f for f in os.listdir("/somedir") if os.path.isfile(os.path.join("/somedir", f))]'
Jeff Luyet
64

Puedes usar os.listdirpara este propósito. Si solo desea archivos y no directorios , puede filtrar los resultados usando os.path.isfile.

ejemplo:

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

o

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
fuente
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
fuente
3
Gracias por dar la solución general (en el caso de que el directorio no sea el cwd).
jwg
10

Puedes usar os.scandir(). La nueva función en stdlib comienza desde Python 3.5.

import os

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

Más rápido que os.listdir(). os.walk() implementos os.scandir() .

prasastoadi
fuente
5

Esto se puede hacer con os.walk ()

Python 3.5.2 probado;

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)

elimine la línea dirs.clear () y los archivos en las subcarpetas se incluirán nuevamente.

actualizar con referencias ;

os.walk documentado aquí y habla sobre la triple lista que se está creando y los efectos de arriba hacia abajo.

.clear () documentado aquí para vaciar una lista

entonces, al borrar la lista relevante de os.walk, puede afectar el resultado a sus necesidades.

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

Puedes mejorar este código con el del dirs[:]que será como seguir.

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

O incluso mejor si pudiera apuntar os.walk con el directorio de trabajo actual.

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
fuente
3

en lugar de os.walk, solo usaos.listdir

Inbar Rose
fuente
1

Puedes usar el módulo pathlib.

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