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)