walk traverse ruta for files example dirs python-3.x os.walk

python 3.x - traverse - ¿Puedo obligar a os.walk de python3 a visitar directorios en orden alfabético? ¿cómo?



python traverse directory (3)

Esta respuesta no es específica para esta pregunta y el problema es un poco diferente, pero la solución se puede utilizar en cualquier caso. Considere tener estos archivos ( "one1.txt" , "one2.txt" , "one10.txt" ) y el contenido de todos ellos es un String "default" :

Quiero recorrer un directorio que contiene estos archivos y encontrar una cadena específica en cada archivo y reemplazarla con el nombre del archivo. Si utiliza cualquier otro método que ya se haya mencionado aquí y en otras preguntas (como dirs.sort() y sorted(files) y sorted(dirs) , el resultado será algo como esto:

"one1.txt"--> "one10" "one2.txt"--> "one1" "one10.txt" --> "one2"

Pero queremos que sea:

"one1.txt"--> "one1" "one2.txt"--> "one2" "one10.txt" --> "one10"

Encontré este método que cambia el contenido del archivo alfabéticamente:

import re, os, fnmatch def atoi(text): return int(text) if text.isdigit() else text def natural_keys(text): '''''' alist.sort(key=natural_keys) sorts in human order http://nedbatchelder.com/blog/200712/human_sorting.html (See Toothy''s implementation in the comments) '''''' return [ atoi(c) for c in re.split(''(/d+)'', text) ] def findReplace(directory, find, replace, filePattern): count = 0 for path, dirs, files in sorted(os.walk(os.path.abspath(directory))): dirs.sort() for filename in sorted(fnmatch.filter(files, filePattern), key=natural_keys): count = count +1 filepath = os.path.join(path, filename) with open(filepath) as f: s = f.read() s = s.replace(find, replace+str(count)+".png") with open(filepath, "w") as f: f.write(s)

A continuación, ejecute esta línea:

findReplace(os.getcwd(), "default", "one", "*.xml")

Me gustaría saber si es posible forzar a os.walk en python3 a visitar los directorios en orden alfabético. Por ejemplo, aquí hay un directorio y un código que recorrerá este directorio:

ryan:~/bktest$ ls -1 sample CD01 CD02 CD03 CD04 CD05 -------- def main_work_subdirs(gl): for root, dirs, files in os.walk(gl[''pwd'']): if root == gl[''pwd'']: for d2i in dirs: print(d2i)

Cuando el código de Python llega al directorio anterior, aquí está el resultado:

ryan:~/bktest$ ~/test.py sample CD03 CD01 CD05 CD02 CD04

Me gustaría forzar la caminata para visitar estas direcciones en orden alfabético, 01, 02 ... 05 . En el documento de os.walk para os.walk , dice:

Cuando topdown es Verdadero, la persona que llama puede modificar la lista de nombres de usuarios en el lugar (tal vez usando la asignación del o slice), y walk () solo retrocederá en los subdirectorios cuyos nombres permanezcan en nombres de usuarios; Esto se puede usar para podar la búsqueda, imponer un orden específico de visitas.

¿ os.walk significa que puedo imponer un orden de visita alfabético en os.walk ? ¿Si es así, cómo?


Sé que esto ya ha sido respondido pero quería agregar un pequeño detalle y agregar más de una sola línea de código en los comentarios es un error.

Además de querer los directorios ordenados, también quería que se ordenaran los archivos para que mi iteración a través de "gl" fuera consistente y predecible. Para hacer esto se requirió un tipo más:

for root, dirs, files in os.walk(gl): dirs.sort() for filename in sorted(files): print(os.path.join(root, filename))


Sí. Usted ordena dirs en el bucle.

def main_work_subdirs(gl): for root, dirs, files in os.walk(gl[''pwd'']): dirs.sort() if root == gl[''pwd'']: for d2i in dirs: print(d2i)