Pregunta Python: Directorio actual en un os.walk


Necesito obtener el directorio actual en un proceso os.walk. Funciona cuando solo hay un nivel de subdirectorio, pero falla cuando hay más. Por favor avise...

[CÓDIGO]

# AFFECTS everything reachable from the directory named in "top",
# assuming there are no symbolic links.
# CAUTION:  This is dangerous!  For example, if top == '/', it
# could affect all your disk files.

import os, glob, arcpy, csv, sys, shutil, datetime
top = r'L:\Raster_Data\Topographic_Maps'
RootOutput = r'L:\Raster_Data\Topographic_Maps'
#FileList = csv.reader(open('FileList.csv'))
SearchString=['Temp_Pol', 'Spatial_Ex']

filecount=0
successcount=0
errorcount=0

print "Working in: "+os.getcwd()

list =[]
f = open(RootOutput+'\\Success_LOG.txt', 'a')
f.write("Log of files Succesfully processed. RESULT of process run @:"+str(datetime.datetime.now())+"\n")
f.close()

#for File in FileList:
for root, dirs, files in os.walk(top, topdown=False):
  #for directory in dirs:
    for file in files:
      #currentPath=os.path.join(root,directory)
      currentPath=os.path.abspath(file)
      os.chdir(currentPath)
      #arcpy.env.workspace = currentPath
      #print os.getcwd()
      lstFCs = glob.glob('*'+SearchString[0]+'*.shp')
      #print lstFCs
      OutPutDir=os.path.abspath(currentPath)
      for fc in lstFCs:
          filecount=filecount+1
          list.append(OutPutDir+"\\"+fc)       

      lstFCs = glob.glob('*'+SearchString[1]+'*.shp')
      #print lstFCs
      for fc in lstFCs:
          OutPutDir=RootOutput+"\\"+directory
          filecount=filecount+1
          list.append(OutPutDir+"\\"+fc)

print 'Merging: ' + str(list)
#arcpy.Merge_management(list, RootOutput+"\\Full_Extent.shp")
print 'Created: '+RootOutput+"\\Full_Extent.shp"
f = open(RootOutput+'\\Success_LOG.txt', 'a')
f.write(str(list)+"\n\n Merged to: "+RootOutput+"\\Full_Extent.shp")
f.close()

por lo tanto, la lista debe adjuntarse con el fc y la ruta completa, pero solo obtiene la ruta raíz y la parte final de la ruta, no los directorios intermedios.

Gracias por su consejo,

[Error de mensajes]

Trabajando en: L: \ Raster_Data \ Topographic_Maps Merging:         ['' L: \ Raster_Data \ Topographic_Maps \ 100K \ 2010_100K \ Map_Sheets_BestResolution \ qld_north \ SE55 \ ecw \ prj_Temp_Polygon_Extent_0.shp ',         'L: \ Raster_Data \ Topographic_Maps \ 100K \ 2010_100K \ Map_Sheets_BestResolution \ qld_north \ SE55 \ ecw \ Temp_Polygon_Extent_0.shp',         'L: \ Raster_Data \ Topographic_Maps \ ecw \ Spatial_Extent.shp',         'L: \ Raster_Data \ Topographic_Maps \ SC54 \ Spatial_Extent.shp',         'L: \ Raster_Data \ Topographic_Maps \ SC55 \ Spatial_Extent.shp',         'L: \ Raster_Data \ Topographic_Maps \ SD54 \ Spatial_Extent.shp',         'L: \ Raster_Data \ Topographic_Maps \ SD55 \ Spatial_Extent.shp',         'L: \ Raster_Data \ Topographic_Maps \ SE54 \ Spatial_Extent.shp',         'L: \ Raster_Data \ Topographic_Maps \ 100K \ 2010_100K \ Map_Sheets_BestResolution \ qld_north \ SE55 \ prj_Temp_Polygon_Extent_0.shp',         'L: \ Raster_Data \ Topographic_Maps \ 100K \ 2010_100K \ Map_Sheets_BestResolution \ qld_north \ SE55 \ Temp_Polygon_Extent_0.shp',         'L: \ Raster_Data \ Topographic_Maps \ SE55 \ Spatial_Extent.shp',         'L: \ Raster_Data \ Topographic_Maps \ SF54 \ Spatial_Extent.shp',         'L: \ Raster_Data \ Topographic_Maps \ SF55 \ Spatial_Extent.shp',         'L: \ Raster_Data \ Topographic_Maps \ SF56 \ Spatial_Extent.shp',         'L: \ Raster_Data \ Topographic_Maps \ SG55 \ Spatial_Extent.shp',         'L: \ Raster_Data \ Topographic_Maps \ SG56 \ Spatial_Extent.shp',         'L: \ Raster_Data \ Topographic_Maps \ SH56 \ Spatial_Extent.shp',         'L: \ Raster_Data \ Topographic_Maps \ Tablelands_100K \ Spatial_Extent.shp',         'L: \ Raster_Data \ Topographic_Maps \ 200DPI \ Spatial_Extent.shp',         'L: \ Raster_Data \ Topographic_Maps \ 1M \ prj_Temp_Polygon_Extent_0.shp',         'L: \ Raster_Data \ Topographic_Maps \ 1M \ Temp_Polygon_Extent_0.shp',         'L: \ Raster_Data \ Topographic_Maps \ 250K \ prj_Temp_Polygon_Extent_1.shp',         'L: \ Raster_Data \ Topographic_Maps \ 250K \ Temp_Polygon_Extent_1.shp',         'L: \ Raster_Data \ Topographic_Maps \ 250K \ Spatial_Extent.shp',         'L: \ Raster_Data \ Topographic_Maps \ 5M \ prj_Temp_Polygon_Extent_2.shp',         'L: \ Raster_Data \ Topographic_Maps \ 5M \ Temp_Polygon_Extent_2.shp',         'L: \ Raster_Data \ Topographic_Maps \ 5M \ Spatial_Extent.shp'] Traceback         (última llamada más reciente): Archivo         "L: \ Raster_Data \ Topographic_Maps \ CreateFileList.py", línea 64, en                      arcpy.Merge_management (lista, RootOutput + "\ Full_Extent.shp")
        Archivo "C: \ Archivos de programa \ ArcGIS \ Desktop10.0 \ arcpy \ arcpy \ management.py",         línea 3124, en Merge             raise e ExecuteError: Error al ejecutar. Los parámetros no son válidos.         ERROR 000732: Conjuntos de datos de entrada: Conjunto de datos         L: \ Raster_Data \ Topographic_Maps \ 100K \ 2010_100K \ Map_Sheets_BestResolution \ qld_north \ SE55 \ ecw \ prj_Temp_Polygon_Extent_0.shp; L: \ Raster_Data \ Topographic_Maps \ 100K \ 2010_100K \ Map_Sheets_BestResolution \ qld_north \ SE55 \ ecw \ Temp_Polygon_Extent_0.shp; L: \ Raster_Data \ Topographic_Maps \ ecw \ Spatial_Extent.shp; L: \ Raster_Data \ Topographic_Maps \ SC54 \ Spatial_Extent.shp; L: \ Raster_Data \ Topographic_Maps \ SC55 \ Spatial_Extent.shp; L: \ Raster_Data \ Topographic_Maps \ SD54 \ Spatial_Extent.shp; L: \ Raster_Data \ Topographic_Maps \ SD55 \ Spatial_Extent.shp; L: \ Raster_Data \ Topographic_Maps \ SE54 \ Spatial_Extent.shp; L: \ Raster_Data \ Topographic_Maps \ 100K \ 2010_100K \ Map_Sheets_BestResolution \ qld_north \ SE55 \ prj_Temp_Polygon_Extent_0.shp; L: \ Raster_Data \ Topography_Maps \ 100K \ 2010_100K \ Map_Sheets_BestResolution \ qld_north \ SE55 \ Temp_Polygon_Extent_0.shp; L: \ Raster_Data \ Plucas de los tipos de trabajo / Toppo_Personal de las personas de la que se trata el tipo de juego. \ Spatial_Extent.shp; L: \ Raster_Data \ Topographi c_Maps \ SF56 \ Spatial_Extent.shp; L: \ Raster_Data \ Topographic_Maps \ SG55 \ Spatial_Extent.shp; L: \ Raster_Data \ Topographic_Maps \ SG56 \ Spatial_Extent.shp; L: \ Raster_Data \ Topographic_Maps \ SH56 \ Spatial_Extent.shp; L: \ Raster_Data \ Topographic_Maps \ Tablelands_100K \ Spatial_Extent.shp; L: \ Depósito de información de la fuente de datos de datos de mapa de datos de la fuente de datos de mapa de datos. : \ Raster_Data \ Topographic_Maps \ 250K \ prj_Temp_Polygon_Extent_1.shp; L: \ Raster_Data \ Topographic_Maps \ 250K \ Temp_Polygon_Extent_1.shp; L: \ Raster_Data \ Topographic_Maps \ 250K \ Spatial_Extent.shp; L: \ Raster_Data \ Topographic_Maps \ 5M \ prj_Temp_Polygon_Extent_2.shp ; L: \ Raster_Data \ Topographic_Maps \ 5M \ Temp_Polygon_Extent_2.shp; L: \ Raster_Data \ Topographic_Maps \ 5M \ Spatial_Extent.shp         no existe o no se admite Error al ejecutar (Combinar).

Trabajando en: L: \ Raster_Data \ Topographic_Maps Traceback (la mayoría         última llamada al último): archivo         "L: \ Raster_Data \ Topographic_Maps \ CreateFileList.py", línea 28, en                      os.chdir (currentPath) WindowsError: [Error 2] El sistema no puede         encuentre el archivo especificado:         'L: \ Raster_Data \ Topographic_Maps \ ecw \ SC54'         directorio 'SC54'         dirs ['SC54', 'SC55', 'SD54', 'SD55', 'SE54', 'SE55']         os.path.abspath (dirs [0])         'L: \ Raster_Data \ Topographic_Maps \ ecw \ SC54'         os.getcwd () 'L: \ Raster_Data \ Topographic_Maps \ ecw'          Trabajando en: L: \ Raster_Data \ Topographic_Maps Traceback (la mayoría         última llamada al último): archivo         "L: \ Raster_Data \ Topographic_Maps \ CreateFileList.py", línea 28, en                      os.chdir (currentPath) WindowsError: [Error 2] El sistema no puede         encuentre el archivo especificado:         'L: \ Raster_Data \ Topographic_Maps \ 7178cp_dd.ers'         archivo '7178cp_dd.ers'         os.path.abspath         os.path.abspath (archivo)         'L: \ Raster_Data \ Topographic_Maps \ 7178cp_dd.ers'


5
2017-08-26 07:05


origen


Respuestas:


Gracias a todos, usé la entrada del foro para completar el script. Está abajo para quien lo quiera. mejor,

# AFFECTS everything reachable from the directory named in "top",
# assuming there are no symbolic links.
# CAUTION:  This is dangerous!  For example, if top == '/', it
# could affect all your disk files.

import os, arcpy, sys, datetime
top = os.getcwd()
RootOutput = top
FileTypes=['shp']
SearchStrings=['Temp_Pol', 'Spatial_Ex']

filecount=0
#successcount=0
#errorcount=0

print "Working in: "+os.getcwd()

list =[]
f = open(RootOutput+'\\Success_LOG.txt', 'a')
f.write("Log of files Succesfully processed. RESULT of process run @:"+str(datetime.datetime.now())+"\n")
f.close()

for root, dirs, files in os.walk(top, topdown=False):
    for fl in files:
      currentFile=os.path.join(root, fl)
      for FileType in FileTypes:
          status= str.endswith(currentFile,FileType)
          if str(status) == 'True':
              for SearchString in SearchStrings:
                  if str(SearchString in currentFile) == 'True':
                    #print str(currentFile)+str(status)       
                    filecount=filecount+1
                    list.append(currentFile)

print 'Merging: ' + str(list)

# Reemplazar con cualquier función que desee llevar a cabo en la lista de archivos generada.     # arcpy.Merge_management (list, RootOutput + "\ Full_Extent.shp")

print 'Created: '+RootOutput+"\\Full_Extent.shp"
f = open(RootOutput+'\\Success_LOG.txt', 'a')
f.write(str(list)+"\n\n Merged to: "+RootOutput+"\\Full_Extent.shp")
f.close()

4
2017-08-29 00:35



Deberías usar

os.path.join(root, file) 

en lugar de simplemente usar el archivo como se sugiere en los ejemplos de doc os.walk os.walk

Por cierto, tenga cuidado con las palabras clave reservadas. archivo es una función incorporada y lista también

>>> a = list()
>>> a
[]
>>> list = []
>>> b = list()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'list' object is not callable

2
2017-08-26 07:20



Para algunas aplicaciones siempre necesitamos cambiar el directorio de trabajo actual mientras estamos en la llamada recursiva os.walk, en ese caso, sugeriría cambiar el directorio de trabajo actual dos veces, como se muestra a continuación. Estoy escribiendo sobre situaciones donde tener rutas de archivos absolutas no ayudará.

from os import listdir
from os.path import isfile, join
import os
import re
# store the location of the top most directory 
top = os.getcwd()

for (dirname, dirs, files) in os.walk(os.getcwd()):        
        for filename in files:
                os.chdir(dirname)
                # add all your operations for the current job in the directory
                # Now go back to the top of the chain
                os.chdir(top)

2
2017-11-20 21:13



Parece que buscas un globo recursivo. Algo como el siguiente código podría ser de utilidad:

class rglob:
    '''A recursive/regex enhanced glob
       adapted from os-path-walk-example-3.py - http://effbot.org/librarybook/os-path.htm 
    '''
    def __init__(self, directory, pattern="*", regex=False, regex_flags=0, recurse=True):
        ''' @type    directory: C{str}
            @param   directory: Path to search
            @type    pattern: C{type}
            @param   pattern: Regular expression/wildcard pattern to match files against
            @type    regex: C{boolean}
            @param   regex: Use regular expression matching (if False, use fnmatch)
                            See U{http://docs.python.org/library/re.html}
            @type    regex_flags: C{int}
            @param   regex_flags: Flags to pass to the regular expression compiler.
                                  See U{http://docs.python.org/library/re.html}
            @type    recurse: C{boolean} 
            @param   recurse: Recurse into the directory?
        '''
        self.stack = [directory]
        self.pattern = pattern
        self.regex = regex
        self.recurse = recurse
        self.regex_flags = regex_flags
        self.files = []
        self.index = 0

    def __getitem__(self, index):
        while 1:
            try:
                file = self.files[self.index]
                self.index = self.index + 1
            except IndexError:
                # pop next directory from stack

                self.directory = self.stack.pop()
                try:
                    self.files = os.listdir(self.directory)
                    self.index = 0
                except:pass
            else:
                # got a filename
                fullname = os.path.join(self.directory, file)
                if os.path.isdir(fullname) and not os.path.islink(fullname) and self.recurse:
                    self.stack.append(fullname)
                if self.regex:
                    import re
                    if re.search(self.pattern,file,self.regex_flags):
                        return fullname
                else:
                    import fnmatch
                    if fnmatch.fnmatch(file, self.pattern):
                        return fullname

shplist=[shp for shp in rglob(top,'*.shp')]
print 'Merging: ' + str(shplist)
#arcpy.Merge_management(shplist, RootOutput+"\\Full_Extent.shp")
print 'Created: '+RootOutput+"\\Full_Extent.shp"
f = open(RootOutput+'\\Success_LOG.txt', 'a')
f.write(str(shplist)+"\n\n Merged to: "+RootOutput+"\\Full_Extent.shp")
f.close()

0
2017-08-26 22:43