python - os.walk sin profundizar en los directorios a continuación
file (15)
¿Cómo limito os.walk
a solo devolver 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
Así es como lo resolví
if recursive:
items = os.walk(target_directory)
else:
items = [next(os.walk(target_directory))]
...
Creo que la solución es realmente muy simple.
utilizar
break
solo para hacer la primera iteración del bucle for, debe haber una manera más elegante.
for root, dirs, files in os.walk(dir_name):
for f in files:
...
...
break
...
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 la secuencia de comandos original y simplemente agregue un descanso .
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")
break
return outputList
En Python 3, pude hacer esto:
import os
dir = "/path/to/files/"
#List all files immediately under this folder:
print ( next( os.walk(dir) )[2] )
#List all folders immediately under this folder:
print ( next( os.walk(dir) )[1] )
Hay una trampa al usar listdir. El os.path.isdir (identificador) debe ser una ruta absoluta. Para elegir los subdirectorios que haces:
for dirname in os.listdir(rootdir):
if os.path.isdir(os.path.join(rootdir, dirname)):
print("I got a subdirectory: %s" % dirname)
La alternativa es cambiar al directorio para hacer las pruebas sin el os.path.join ().
La misma idea con listdir
, pero más corta:
[f for f in os.listdir(root_dir) if os.path.isfile(os.path.join(root_dir, f))]
La sugerencia de usar listdir
es buena. La respuesta directa a su pregunta es root, dirs, files = os.walk(dir_name).next()
Me sentí como si arrojara mis 2 peniques.
baselevel = len(rootdir.split("//"))
for subdirs, dirs, files in os.walk(rootdir):
curlevel = len(subdirs.split("//"))
if curlevel <= baselevel + 1:
[do stuff]
No use os.walk.
Ejemplo:
import os
root = "C://"
for item in os.listdir(root):
if os.path.isfile(os.path.join(root, item)):
print item
Puede usar os.listdir()
que devuelve una lista de nombres (para archivos y directorios) en un directorio determinado. Si necesita distinguir entre archivos y directorios, llame a os.stat()
en cada nombre.
Puedes usar este fragmento
for root, dirs, files in os.walk(directory):
if level > 0:
# do some stuff
else:
break
level-=1
Si tiene requisitos más complejos que solo el directorio superior (p. Ej., Ignore los directorios de VCS, etc.), también puede modificar la lista de directorios para evitar que os.walk recursive a través de ellos.
es decir:
def _dir_list(self, dir_name, whitelist):
outputList = []
for root, dirs, files in os.walk(dir_name):
dirs[:] = [d for d in dirs if is_good(d)]
for f in files:
do_stuff()
Nota: tenga cuidado de mutar la lista, en lugar de simplemente volver a vincularla. Obviamente, os.walk no sabe acerca de la reenlace externa.
También podría hacer lo siguiente:
for path, subdirs, files in os.walk(dir_name):
for name in files:
if path == ".": #this will filter the files in the current directory
#code here
Use la función walklevel
.
import os
def walklevel(some_dir, level=1):
some_dir = some_dir.rstrip(os.path.sep)
assert os.path.isdir(some_dir)
num_sep = some_dir.count(os.path.sep)
for root, dirs, files in os.walk(some_dir):
yield root, dirs, files
num_sep_this = root.count(os.path.sep)
if num_sep + level <= num_sep_this:
del dirs[:]
Funciona igual que os.walk
, pero puede pasarle un parámetro de level
que indique qué tan profunda será la recursión.
crea una lista de exclusiones, usa fnmatch para omitir la estructura del directorio y hacer el proceso
excludes= [''a/*/b'', ''c/d/e'']
for root, directories, files in os.walk(''Start_Folder''):
if not any(fnmatch.fnmatch(nf_root, pattern) for pattern in excludes):
for root, directories, files in os.walk(nf_root):
....
do the process
....
lo mismo que para ''incluye'':
if **any**(fnmatch.fnmatch(nf_root, pattern) for pattern in **includes**):
for path, dirs, files in os.walk(''.''):
print path, dirs, files
del dirs[:] # go only one level deep