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.

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)


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.

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
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() .


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.


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


1

Puedes usar el módulo pathlib.

from pathlib import Path
x = Path('./')
print(list(filter(lambda y:y.is_file(), x.iterdir())))
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.