2013-05-09 16 views
13

Próbuję wykonać pewne geoprzetwarzanie. Moim zadaniem jest zlokalizować wszystkie pliki shape w katalogu, a następnie znaleźć pełną ścieżkę do pliku shape w katalogu. Mogę uzyskać nazwę pliku shape, ale nie wiem, jak uzyskać pełną nazwę ścieżki dla tego shapefile.Potrzebuję ścieżki do poszczególnych plików za pomocą os.walk()

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

Odpowiedz

38

os.walk daje ścieżkę do katalogu, w którym pierwsza wartość w pętli, wystarczy użyć os.path.join() stworzyć pełną Nazwa pliku:

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

I przemianowany path w pętli do dirpath aby nie kolidować z zmienna path, którą już przechodziłeś pod numer os.walk().

Należy pamiętać, że nie trzeba testować, jeśli wynik jest następujący: .endswith() == True; if robi to już dla ciebie, część == True jest całkowicie zbędna.

Można użyć .extend() i wyrażenie generator, aby powyższy kod nieco bardziej zwarty:

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

lub nawet jako jedna lista zrozumieniem:

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

Dziękujemy za pomoc! Myślę, że to było łatwiejsze niż myślałem. – Schack

-1

Wydaje os.path.abspath(finename) zadziała. Proszę spróbować.

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

Nie, nie będzie. 'abspath' oprze nazwę pliku * bieżącego katalogu roboczego *, który może być całkowicie inną ścieżką. –

+0

@Martijn: tak masz rację. – gsmaker

-1

Dlaczego nie import glob?

import glob 

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

i uzyskać wszystkie JPEG zechcę, z absolutną ścieżkę

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

'glob()' obsługuje tylko stałą głębokość podkatalogów, 'os.walk()' obsługuje dowolne głębie. Zobacz [Jak mogę wyszukać podfoldery za pomocą modułu glob.glob w Pythonie?] (Http://stackoverflow.com/questions/14798220/14798263#14798263) –

Powiązane problemy