Pregunta

¿Cómo puedo obtener una lista de todos los archivos (archivos y directorios) en un directorio dado en Python?

¿Fue útil?

Solución

Este es un camino a recorrer cada archivo y directorio en un árbol de directorios:

import os

for dirname, dirnames, filenames in os.walk('.'):
    # print path to all subdirectories first.
    for subdirname in dirnames:
        print(os.path.join(dirname, subdirname))

    # print path to all filenames.
    for filename in filenames:
        print(os.path.join(dirname, filename))

    # Advanced usage:
    # editing the 'dirnames' list will stop os.walk() from recursing into there.
    if '.git' in dirnames:
        # don't go into any .git directories.
        dirnames.remove('.git')

Otros consejos

Puede utilizar

os.listdir(path)

Para la referencia y la más os funciones mira aquí:

Aquí está una función auxiliar que uso muy a menudo:

import os

def listdir_fullpath(d):
    return [os.path.join(d, f) for f in os.listdir(d)]
import os

for filename in os.listdir("C:\\temp"):
    print  filename

Si usted necesita englobamiento de habilidades, hay un módulo para que así.Por ejemplo:

import glob
glob.glob('./[0-9].*')

devolverá algo como:

['./1.gif', './2.txt']

Consulte la documentación aquí.

Intente esto:

import os
for top, dirs, files in os.walk('./'):
    for nm in files:       
        print os.path.join(top, nm)

Para los archivos en el directorio actual de trabajo, sin especificar una ruta de acceso

Python 2.7:

import os
os.listdir(os.getcwd())

Python 3.x:

import os
os.listdir()

Gracias a Stam Kaly para los comentarios en python 3.x

Una implementación recursiva

import os

def scan_dir(dir):
    for name in os.listdir(dir):
        path = os.path.join(dir, name)
        if os.path.isfile(path):
            print path
        else:
            scan_dir(path)

Me escribió una versión larga, con todas las opciones que necesite: http://sam.nipl.net/code/python/find.py

Supongo que no caben aquí también:

#!/usr/bin/env python

import os
import sys

def ls(dir, hidden=False, relative=True):
    nodes = []
    for nm in os.listdir(dir):
        if not hidden and nm.startswith('.'):
            continue
        if not relative:
            nm = os.path.join(dir, nm)
        nodes.append(nm)
    nodes.sort()
    return nodes

def find(root, files=True, dirs=False, hidden=False, relative=True, topdown=True):
    root = os.path.join(root, '')  # add slash if not there
    for parent, ldirs, lfiles in os.walk(root, topdown=topdown):
        if relative:
            parent = parent[len(root):]
        if dirs and parent:
            yield os.path.join(parent, '')
        if not hidden:
            lfiles   = [nm for nm in lfiles if not nm.startswith('.')]
            ldirs[:] = [nm for nm in ldirs  if not nm.startswith('.')]  # in place
        if files:
            lfiles.sort()
            for nm in lfiles:
                nm = os.path.join(parent, nm)
                yield nm

def test(root):
    print "* directory listing, with hidden files:"
    print ls(root, hidden=True)
    print
    print "* recursive listing, with dirs, but no hidden files:"
    for f in find(root, dirs=True):
        print f
    print

if __name__ == "__main__":
    test(*sys.argv[1:])

Una buena funda para la lista de sólo los archivos de forma recursiva.He utilizado este en mi setup.py package_data directiva:

import os

[os.path.join(x[0],y) for x in os.walk('<some_directory>') for y in x[2]]

Sé que no es la respuesta a la pregunta, pero puede ser útil

Para Python 2

#!/bin/python2

import os

def scan_dir(path):
    print map(os.path.abspath, os.listdir(pwd))

Para Python 3

Para el filtro y el mapa, es necesario envolverlos con lista()

#!/bin/python3

import os

def scan_dir(path):
    print(list(map(os.path.abspath, os.listdir(pwd))))

La recomendación es que ahora, de reemplazar el uso de mapa y el filtro con generadores de expresiones o lista de comprensión:

#!/bin/python

import os

def scan_dir(path):
    print([os.path.abspath(f) for f in os.listdir(path)])

Aquí está una línea de Python versión:

import os
dir = 'given_directory_name'
filenames = [os.path.join(os.path.dirname(os.path.abspath(__file__)),dir,i) for i in os.listdir(dir)]

Este código muestra la ruta de acceso completa de todos los archivos y directorios en el directorio dado nombre.

Aquí es otra opción.

os.scandir(path='.')

Devuelve un iterador de os.DirEntry los objetos correspondientes a las entradas (junto con la información de atributo de archivo) en el directorio dado por el camino.

Ejemplo:

with os.scandir(path) as it:
    for entry in it:
        if not entry.name.startswith('.'):
            print(entry.name)

El uso de scandir() en lugar de listdir() puede aumentar significativamente el rendimiento de código que también necesita un tipo de archivo o información de atributo de archivo, porque os.DirEntry objetos de exponer esta información si el sistema operativo proporciona cuando el escaneo de un directorio.Todos los sistemas operativos.DirEntry métodos pueden realizar una llamada al sistema, pero is_dir() y is_file() por lo general sólo requieren una llamada al sistema para enlaces simbólicos;os.DirEntry.stat() siempre requiere una llamada al sistema en Unix, pero sólo se requiere uno de los enlaces simbólicos en Windows.

Python Docs

#import modules
import os

_CURRENT_DIR = '.'


def rec_tree_traverse(curr_dir, indent):
    "recurcive function to traverse the directory"
    #print "[traverse_tree]"

    try :
        dfList = [os.path.join(curr_dir, f_or_d) for f_or_d in os.listdir(curr_dir)]
    except:
        print "wrong path name/directory name"
        return

    for file_or_dir in dfList:

        if os.path.isdir(file_or_dir):
            #print "dir  : ",
            print indent, file_or_dir,"\\"
            rec_tree_traverse(file_or_dir, indent*2)

        if os.path.isfile(file_or_dir):
            #print "file : ",
            print indent, file_or_dir

    #end if for loop
#end of traverse_tree()

def main():

    base_dir = _CURRENT_DIR

    rec_tree_traverse(base_dir," ")

    raw_input("enter any key to exit....")
#end of main()


if __name__ == '__main__':
    main()

FYI Agregar un filtro de ampliación o extensión de archivo importación os

path = '.'
for dirname, dirnames, filenames in os.walk(path):
    # print path to all filenames with extension py.
    for filename in filenames:
        fname_path = os.path.join(dirname, filename)
        fext = os.path.splitext(fname_path)[1]
        if fext == '.py':
            print fname_path
        else:
            continue
import os, sys

#open files in directory

path = "My Documents"
dirs = os.listdir( path )

# print the files in given directory

for file in dirs:
   print (file)

Si pensé en tirar esto en.Simple y sucia manera de hacer búsquedas con caracteres comodín.

import re
import os

[a for a in os.listdir(".") if re.search("^.*\.py$",a)]

Código a continuación encontrará la lista de directorios y archivos dentro de los directorios

def print_directory_contents(sPath):
        import os                                       
        for sChild in os.listdir(sPath):                
            sChildPath = os.path.join(sPath,sChild)
            if os.path.isdir(sChildPath):
                print_directory_contents(sChildPath)
            else:
                print(sChildPath)

Sé que esta es una vieja cuestión.Esta es una buena manera me llegó a través de si usted está en un liunx de la máquina.

import subprocess
print(subprocess.check_output(["ls", "/"]).decode("utf8"))

El que trabajó conmigo es una versión modificada de Saleh respuesta anterior.

El código es el siguiente:

"dir = 'given_directory_name' nombres = [os.ruta de acceso.abspath(os.ruta de acceso.join(dir,i)) for i in os.listdir(dir)]"

Mientras os.listdir() está muy bien para generar una lista de archivos y directorios nombres, frecuencia con la que desea hacer más de una vez que tenga esos nombres - y en Python3, pathlib hace que esas otras tareas sencillas.Vamos a echar un vistazo y ver si te gusta tanto como a mí.

A la lista de directorios de contenidos, la construcción de un objeto de Trazado y agarrar el iterador:

In [16]: Path('/etc').iterdir()
Out[16]: <generator object Path.iterdir at 0x110853fc0>

Si queremos simplemente una lista de nombres de las cosas:

In [17]: [x.name for x in Path('/etc').iterdir()]
Out[17]:
['emond.d',
 'ntp-restrict.conf',
 'periodic',

Si usted quiere el dirs:

In [18]: [x.name for x in Path('/etc').iterdir() if x.is_dir()]
Out[18]:
['emond.d',
 'periodic',
 'mach_init.d',

Si desea que los nombres de todos los archivos de conf en el árbol:

In [20]: [x.name for x in Path('/etc').glob('**/*.conf')]
Out[20]:
['ntp-restrict.conf',
 'dnsextd.conf',
 'syslog.conf',

Si desea una lista de conf archivos en el árbol de >= 1K:

In [23]: [x.name for x in Path('/etc').glob('**/*.conf') if x.stat().st_size > 1024]
Out[23]:
['dnsextd.conf',
 'pf.conf',
 'autofs.conf',

La resolución de las rutas de acceso relativas convertido en fácil:

In [32]: Path('../Operational Metrics.md').resolve()
Out[32]: PosixPath('/Users/starver/code/xxxx/Operational Metrics.md')

Navegar con una Ruta de acceso es bastante claro (aunque inesperado):

In [10]: p = Path('.')

In [11]: core = p / 'web' / 'core'

In [13]: [x for x in core.iterdir() if x.is_file()]
Out[13]:
[PosixPath('web/core/metrics.py'),
 PosixPath('web/core/services.py'),
 PosixPath('web/core/querysets.py'),
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top