¿Cómo me limito os.walk
a 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.name
lugar def.path
. Esta es la solución más rápida y mucho más rápida que cualquier otrawalk
olistdir
, consulte stackoverflow.com/a/40347279/2441026 .Respuestas:
Usa la
walklevel
función.Funciona igual
os.walk
, pero puede pasarle unlevel
parámetro que indique qué tan profunda será la recursividad.fuente
dirs = []
ydirs = None
eso no funcionó.map(dirs.remove, dirs)
funcionó, pero con algunos mensajes "[Ninguno]" no deseados impresos. Entonces, ¿por quédel dirs[:]
específicamente?topdown=False
en 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 = None
no 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.isfile
yos.path.isdir
te permite diferenciarte. No lo entiendo, ya queos.path.isfile
está 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.walk
le brinda inmediatamente las listas separadas de directorios y archivos..next()
) y está mucho más cerca de tu idea.os.scandir
funció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
listdir
es 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, files
solo corresponderán a las variables del generador adir_name
nivel.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.scandir
lugar deos.listdir
. En lugar de cadenas, obtienes un iterador deDirEntry
objetos a cambio. De los documentos:Puede acceder al nombre del objeto a través del
DirEntry.name
cual es equivalente a la salida deos.listdir
fuente
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
range
yos.walk
combinado 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
break
es 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 elfile
deroot, dirs, file
mencionado en otras respuestasfuente
La carpeta raíz cambia para cada directorio que encuentra os.walk. Solucioné eso comprobando si root == directorio
fuente
fuente