ruta - manejo de archivos y carpetas en python
Listar archivos en SOLAMENTE el directorio actual (8)
Mi solución es:
import re
p = re.compile(''[a-z]+'', re.IGNORECASE)
words = p.findall("Hello, world! I''m a coder")
Creo que esta solución es mejor
En Python, solo quiero enumerar todos los archivos en el directorio actual SOLAMENTE. No quiero que los archivos aparezcan en ningún subdirectorio o padre.
Parece que hay 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 quiero que aparezcan en la lista.
Puede 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()
implements os.scandir()
.
Puede usar os.listdir
para este propósito. Si solo desea archivos y no directorios , puede filtrar los resultados utilizando 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.
Solo use os.listdir
y os.path.isfile
lugar de os.walk
.
Ejemplo:
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 f
no 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 Causality por la pista)
en lugar de os.walk
, solo usa os.listdir
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 subcarpetas se incluyen de nuevo.
actualización con referencias ;
os.walk documentado aquí y habla sobre la lista triple que se está creando y los efectos descendentes.
.clear() documentado aquí para vaciar una lista
así que al borrar la lista relevante de os.walk, puede aplicar el resultado a sus necesidades.
import os
destdir = ''/var/tmp/testdir''
files = [ f for f in os.listdir(destdir) if os.path.isfile(os.path.join(destdir,f)) ]
import os
for subdir, dirs, files in os.walk(''./''):
for file in files:
do some stuff
print file
Puede mejorar este código con del dirs[:]
que será similar a 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 a 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