¿Cómo me limito os.walka devolver solo archivos en el directorio que proporciono?
def _dir_list(self, dir_name, whitelist):
outputList = []
for root, dirs, files in os.walk(dir_name):
for f in files:
if os.path.splitext(f)[1] in whitelist:
outputList.append(os.path.join(root, f))
else:
self._email_to_("ignore")
return outputList

files_with_full_path = [f.path for f in os.scandir(dir) if f.is_file()]. En caso de que solo necesite los nombres de archivo, use enf.namelugar def.path. Esta es la solución más rápida y mucho más rápida que cualquier otrawalkolistdir, consulte stackoverflow.com/a/40347279/2441026 .Respuestas:
Usa la
walklevelfunción.Funciona igual
os.walk, pero puede pasarle unlevelparámetro que indique qué tan profunda será la recursividad.fuente
dirs = []ydirs = Noneeso no funcionó.map(dirs.remove, dirs)funcionó, pero con algunos mensajes "[Ninguno]" no deseados impresos. Entonces, ¿por quédel dirs[:]específicamente?topdown=Falseen os.walk. Consulte el cuarto párrafo en los documentos :Modifying dirnames when topdown is False has no effect on the behavior of the walk, because in bottom-up mode the directories in dirnames are generated before dirpath itself is generated.dirs = []ydirs = Noneno funcionarán porque simplemente crean un nuevo objeto no relacionado y lo asignan al nombredirs. El objeto de la lista original debe modificarse in situ, no el nombredirs.No use os.walk.
Ejemplo:
fuente
os.path.isfileyos.path.isdirte permite diferenciarte. No lo entiendo, ya queos.path.isfileestá en el código de muestra desde '08 y su comentario es de '16. Esta es claramente la mejor respuesta, ya que no tiene la intención de recorrer un directorio, sino de enumerarlo.walkle brinda inmediatamente las listas separadas de directorios y archivos..next()) y está mucho más cerca de tu idea.os.scandirfunción que permite una interacción archivo-o-directorio-objeto más sofisticada. Vea mi respuesta a continuaciónCreo que la solución es realmente muy sencilla.
utilizar
para hacer solo la primera iteración del ciclo for, debe haber una forma más elegante.
La primera vez que llama a os.walk, devuelve tulipanes para el directorio actual, luego, en el siguiente ciclo, el contenido del siguiente directorio.
Tome el guión original y agregue un descanso .
fuente
La sugerencia de uso
listdires buena. La respuesta directa a su pregunta en Python 2 esroot, dirs, files = os.walk(dir_name).next().La sintaxis equivalente de Python 3 es
root, dirs, files = next(os.walk(dir_name))fuente
root, dirs, files = os.walk(dir_name).next()me daAttributeError: 'generator' object has no attribute 'next'root, dirs, files = next(os.walk(dir_name))y luego las variablesroot, dirs, filessolo corresponderán a las variables del generador adir_namenivel.Puede usar
os.listdir()que devuelve una lista de nombres (tanto para archivos como para directorios) en un directorio determinado. Si necesita distinguir entre archivos y directorios, llameos.stat()a cada nombre.fuente
Si tiene requisitos más complejos que solo el directorio superior (por ejemplo, ignore los directorios VCS, etc.), también puede modificar la lista de directorios para evitar que os.walk vuelva a recorrerlos.
es decir:
Nota: tenga cuidado de mutar la lista, en lugar de simplemente volver a enlazarla. Obviamente, os.walk no conoce la reencuadernación externa.
fuente
fuente
La misma idea con
listdir, pero más breve:fuente
Tenía ganas de tirar mis 2 peniques.
fuente
En Python 3, pude hacer esto:
fuente
Desde Python 3.5 puede usar en
os.scandirlugar deos.listdir. En lugar de cadenas, obtienes un iterador deDirEntryobjetos a cambio. De los documentos:Puede acceder al nombre del objeto a través del
DirEntry.namecual es equivalente a la salida deos.listdirfuente
scandir(), ya que es mucho más rápido quelistdir(). Consulte los puntos de referencia aquí: stackoverflow.com/a/40347279/2441026 .También puede hacer lo siguiente:
fuente
Así es como lo resolví
fuente
Hay un problema al usar listdir. Os.path.isdir (identificador) debe ser una ruta absoluta. Para elegir subdirectorios debe:
La alternativa es cambiar al directorio para realizar la prueba sin os.path.join ().
fuente
Puedes usar este fragmento
fuente
cree una lista de exclusiones, use fnmatch para omitir la estructura del directorio y realice el proceso
lo mismo que para 'incluye':
fuente
¿Por qué no simplemente usar una
rangeyos.walkcombinado con elzip? No es la mejor solución, pero también funcionaría.Por ejemplo así:
Funciona para mí en Python 3.
Además: A también
breakes más simple por cierto. (Mira la respuesta de @Pieter)fuente
Un ligero cambio en la respuesta de Alex, pero usando
__next__():print(next(os.walk('d:/'))[2])oprint(os.walk('d:/').__next__()[2])con el
[2]ser elfilederoot, dirs, filemencionado en otras respuestasfuente
La carpeta raíz cambia para cada directorio que encuentra os.walk. Solucioné eso comprobando si root == directorio
fuente
fuente