A minap azzal találtam magam szembe, hogy egy mappában lévő shapefájlokról (ezekről olvashatsz a Webes térinformatika - PaciTrip 2. rész (Téradatok előkészítése) cikkünkben is) kellett listát kreálnom, mert ha már átküldöm azokat kollégáknak, egyrész tudják, hogy mit kapnak, másrészt, némi magyarázatot is fűzhetek a lista elemeihez. Na persze nem egy-két, hanem több mint harminc shapefájlról volt szó. Ilyen mennyiségnél az ember már inkább elkezd automatizált megoldásban gondolkodni, mint hogy elkezdjen egyesével gyűjtögetni. Utóbbinak a kényelmetlenségen kívül a nagyobb hibázási lehetőség is meglehetős hátránya. Tehát mi lenne, ha írnék egy Python szkriptet?
Ez lett belőle:
1. Python szkript esetén először be kell hívni az os modult, amely lehetővé teszi olyan műveletek elvégzését, amelyekért az operációs rendszer a felelős, pl. fájlok kezelése: “import os”.
import os
2. Aztán kell a mappa, aminek a tartalmát ki akarjuk listázni: ennek elérése legyen most egyszerűen a „path”. Fontos, hogy Python esetében az elérési útnál a \ helyett /-t kell használni!
import os
path = 'C:/sok_shape'
3. Aztán szükség lesz a mappa tartalmának listázására: „listdir”. A listdir bemenetként egy könyvtár elérési útvonalát várja, kimenetként pedig az abban található mappák és fájlok nevét adja vissza.
import os
path = 'C:/sok_shape'
files = os.listdir(path)
4. És már csak egy ciklusra van szükség, ami végig fut a lista elemein (“file”), és kiírja a shapefájlok neveit (kiterjesztés nélkül), de csak egyszer. Na itt álljunk meg egy pillanatra! Miért írtam, hogy „csak egyszer”? Mert a shapefájl olyan téradatformátum, amelynek – a cikk témája szempontjából legérdekesebb – sajátossága, hogy egy shapefájlhoz minimum 3 fájl tartozik, amihez további 9 társulhat. Ezek csak együtt eredményezik a shapefájl megfelelő használhatóságát. Az egy shapefájlhoz tartozó fájlok elnevezése azonos, kiterjesztésük különbözik (pl. cpg, dbf, prj, sbn, sbx, shp, shx, xml).
A ciklusmag először feldarabolja a fájlnevet a megadott karakter (separator) mentén: „split”. Így egy lista készül a háttérben a darabokból, amelyeket az indexük alapján azonosíthatók. Jelen esetben a fájlnevet („fname”) az első – azaz Python szkriptben 0. – darabban találjuk, a nekünk kellő kiterjesztést (“ext”) a Python szkriptben -1., vagyis hátulról az első darabban.
SHP kiterjesztésű fájl minden esetben tartozik a shapefájlhoz, így teljes listát kapunk, ha azokat íratjuk ki: „print”. A print az utána lévő zárójelben megadott objektumot írja ki.
import os
path = 'C:/sok_shape'
files = os.listdir(path)
for file in files:
parts = file.split('.')
fname = parts[0]
ext = parts[-1]
if ext == 'shp':
print (fname)
A script az utolsó két sor elhagyásával egyéb fájlok kilistázására is felhasználható, továbbá mappák elnevezéseinek listázást is végrehajtja.
Aki a fájlistát inkább Excelben használná vagy az Excel-makrók világa közelebb áll hozzá, feltétlenül nézze meg a Excel makró - Lista készítése egy mappában található fájlokról cikkünket.