2011-04-14 6 views
9

Estoy escribiendo y probando el código en XPsp3 w/python 2.7. Estoy ejecutando el código en el servidor 2003 w/python 2.7. Mi estructura de directorio se verá algo como estopython enumerando los directorios en un orden diferente basado en la plataforma

d:\ssptemp 
d:\ssptemp\ssp9-1 
d:\ssptemp\ssp9-2 
d:\ssptemp\ssp9-3 
d:\ssptemp\ssp9-4 
d:\ssptemp\ssp10-1  
d:\ssptemp\ssp10-2 
d:\ssptemp\ssp10-3 
d:\ssptemp\ssp10-4 

Dentro de cada directorio hay uno o más archivos que tendrán "IWPCPatch" como parte del nombre de archivo.

Dentro de uno de estos archivos (uno en cada dir), habrá la línea 'IWPCPatchFinal_a.wsf'

Lo que hago es

1) os.walk en todos los directorios en D: \ ssptemp

2) Buscar todos los archivos con 'IWPCPatch' en el nombre del archivo

3) comprobar el contenido del archivo para 'IWPCPatchFinal_a.wsf'

4) Si co ntents es cierto. Agrego la ruta de ese archivo a una lista.

Mi problema es que en mi máquina XP funciona bien. Si imprimo los resultados de la lista, obtengo varios artículos en el orden que indiqué anteriormente.

Cuando lo muevo a la máquina del servidor 2003 obtengo los mismos contenidos en un orden diferente. Viene ssp10-X, luego ssp9-X. Y esto me está causando problemas con un área diferente en el programa.

Puedo ver por mi salida que comienza el os.walk en el orden incorrecto, pero no sé por qué ocurre eso.

import os 
import fileinput 

print "--createChain--" 

listOfFiles = [] 
for path, dirs, files in os.walk('d:\ssptemp'): 

    print "parsing dir(s)" 
    for file in files: 
     newFile = os.path.join(path,file) 
     if newFile.find('IWPCPatch') >= 0: 
      for line in fileinput.FileInput(newFile): 
       if "IWPCPatchFinal_a.wsf" in line: 
        listOfFiles.append(newFile)        
        print "Added", newFile 

for item in listOfFiles: 
    print "list item", item 

Respuesta

12

El orden de los directorios dentro os.walk no es necesariamente alfabético (creo que es en realidad depende de cómo se almacenan dentro de la dirent en el sistema de archivos). Es probable que sea estable en el mismo directorio exacto (en el mismo sistema de archivos) si no cambia el contenido del directorio (es decir, las llamadas repetidas devolverán el mismo orden), pero el orden no es necesariamente alfabético.

Si desea tener una lista ordenada de nombres de archivos, deberá compilar la lista y luego ordenarla usted mismo.

+1

Lo que él dijo. No confíe en que el sistema operativo haga lo correcto (especialmente en el caso de Windows, que varía mucho entre cada versión). Ordene los datos por su cuenta antes de iterarlos. – jathanism

+0

Eso es lo que pensé que ibas a decir :( – ccwhite1

+0

Si hago un list.sort() en XP, los pone en el mismo orden que 2003. Lo que puedo hacer es extraer los números en el nombre del directorio y crear el lista como [ruta, X, Y] (es decir [, 10,1]). Luego podría hacer algún tipo de ordenamiento en la columna X, Y. Pero ¿cómo se hace una clasificación de 2 columnas? – ccwhite1

13
for path, dirs, files in os.walk('d:\ssptemp'): 

    # sort dirs and files 
    dirs.sort() 
    files.sort() 

    print "parsing dir(s)" 
    # ... 
+0

esta respuesta es exactamente lo que necesito. Y simple. – Mark

Cuestiones relacionadas