Directorio-lista de árboles en Python
-
02-07-2019 - |
Pregunta
¿Cómo puedo obtener una lista de todos los archivos (archivos y directorios) en un directorio dado en Python?
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í:
- Python 2 docs: https://docs.python.org/2/library/os.html#os.listdir
- Python 3 docs: https://docs.python.org/3/library/os.html#os.listdir
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.
#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'),