2013-05-09 10 views
13

Sto tentando di eseguire un geoprocessing. Il mio compito è quello di localizzare tutti gli shapefile all'interno di una directory, e quindi trovare il nome completo del path per quello shapefile all'interno della directory. Posso ottenere il nome dello shapefile, ma non so come ottenere il nome completo del percorso per lo shapefile.È necessario il percorso per determinati file utilizzando os.walk()

shpfiles = [] 
for path, subdirs, files in os.walk(path): 
    for x in files: 
     if x.endswith(".shp") == True: 
      shpfiles.append[x] 

risposta

38

os.walk ti dà il percorso della directory del primo valore nel ciclo, basta usare os.path.join() per creare nome completo del file:

shpfiles = [] 
for dirpath, subdirs, files in os.walk(path): 
    for x in files: 
     if x.endswith(".shp"): 
      shpfiles.append(os.path.join(dirpath, x)) 

ho rinominato path nel ciclo di dirpath di non entrare in conflitto con la variabile path che stavi già passando a os.walk().

Nota che non è necessario verificare se il risultato di .endswith() == True; if lo fa già per te, la parte == True è completamente ridondante.

È possibile utilizzare .extend() e un'espressione generatore per rendere il codice sopra un po 'più compatta:

shpfiles = [] 
for dirpath, subdirs, files in os.walk(path): 
    shpfiles.extend(os.path.join(dirpath, x) for x in files if x.endswith(".shp")) 

o anche come una lista di comprensione:

shpfiles = [os.path.join(d, x) 
      for d, dirs, files in os.walk(path) 
      for x in files if x.endswith(".shp")] 
+0

Grazie per il vostro aiuto! Immagino sia stato più facile di quanto pensassi. – Schack

-1

Sembra os.path.abspath(finename) funzionerà. Per favore prova.

shpfiles = [] 
for path, subdirs, files in os.walk(path): 
    for x in files: 
     if x.endswith(".shp") == True: 
      shpfiles.append(os.path.join(path, x)) 
+3

No non lo farà. 'abspath' baserà il nome file della * current working directory *, che può essere completamente un percorso completamente diverso. –

+0

@Martijn: si hai ragione. – gsmaker

-1

Perché non import glob?

import glob 

print(glob.glob('F:\OTHERS\PHOTOS\Panama\\mai13*\\*.jpg')) 

e ottengo tutto il jpeg che voglio, con il percorso assoluto

>>> 
['F:\\OTHERS\\PHOTOS\\Panama\\mai13\\03052013271.jpg', 
'F:\\OTHERS\\PHOTOS\\Panama\\mai13\\05052013272.jpg', 
'F:\\OTHERS\\PHOTOS\\Panama\\mai13\\05052013273.jpg'] 
+2

'glob()' supporta solo una profondità fissa di sottodirectory, 'os.walk()' supporta profondità arbitrarie. Vedi [Come posso cercare sottocartelle usando il modulo glob.glob in Python?] (Http://stackoverflow.com/questions/14798220/14798263#14798263) –

Problemi correlati