Python - Egy mappa tartalmának kilistázása - továbbfejlesztve

A múltkori szkript (Python - Egy mappa tartalmának kilistázása) után felmerült, hogy – elszakadva a térinformatikától - általánosabbá lehetne tenni: jó lenne, ha meg lehetne adni a listázandó fájlnevek egy részletét, vagy a kiterjesztést szabadon.

Természetesen a kiindulás a korábbi kód volt:

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)

Először a kiterjesztés meghatározását („extension”) emeltem ki a kód törzséből. Ha minden almappát és fájlt ki akarsz listázni egy mappából, hagyd üresen, ahogy az alábbi kódban is van. (Az almappák listázáshoz egyébként is így kell eljárni.)

import os
path = 'C:/sok_shape'
extension = ''
files = os.listdir(path)
for file in files:
    parts = file.split('.')
    fname = parts[0]
    ext = parts[-1]
    if ext == extension:
        print(fname)

A fájlnév részletének maghatározásához bevezettem a „text” paramétert. A paraméterek kiemelése azt sugalta, hogy így már célszerű lenne funkciót készíteni belőle.  A funkció elnevezése a legfőbb tevékenysége és annak továbbfejlesztett volta alapján „listDirSpecial” lett. A funkció bemeneti paraméterei közül az elérési útvonalat „userpath”-nak, a fájlnév részletet „usertext”-nek, a kiterjesztést „userextension”-nek neveztem el.

A könnyebb követhetőség kedvéért az egyes kódrészeket kikommentezett címekkel láttam el.

# A funkció elkészítése
def listDirSpecial(userpath, usertext, userextension):
    import os
    files = os.listdir(userpath)
    for file in files:
        parts = file.split('.')
        fname = parts[0]
        ext = parts[-1]
        if ext == userextension:
            print(fname)
# A funkció futtatása
path = 'C:/sok_shape'
extension = ''
text = ''
listDirSpecial(path,text,extension)

A keresendő „text” és „extension” vizsgálata után (ha egyik sincs megadva, ha a fájlrészlet van megadva, ha a kiterjesztés van megadva, illetve ha mindkettő megvan adva) iratható ki a megfelelő lista.

# A funkció elkészítése
def listDirSpecial(userpath, usertext, userextension):
    import os
    files = os.listdir(userpath)
    for file in files:
    # Fájlnév-darabolás
        parts = file.split('.')
        fname = parts[0]
        ext = parts[-1]
    # Fájlnév-kiíratás
        if userextension == '':
            if usertext == '':
                print(fname)
            elif usertext() in fname():
                print(fname)
        elif usertext == '' and ext == userextension:
            print(fname)
        elif usertext() in fname() and ext == userextension:
            print(fname)
# A funkció futtatása
path = 'C:/sok_shape'
extension = ''
text = ''
listDirSpecial(path,text,extension)

A feladat ezzel teljesítve és itt be is fejezhetném, azonban a kód tesztelése során több új szempont is felmerült. Az egyik, hogy a szkript ne legyen érzékeny a kis és nagy betűkre. Ezt úgy oldottam meg, hogy a „lower” metódussal az eredet-mappában lévő fájlok nevét („fname.lower”) is és a megadott fájlrészletet („usertext.lower”) is kisbetűsítem. (Lehetett volna nagybetűsíteni is az „upper” metódussal, ebben az esetben nem lett volna különbség, én a kisbetűsítés mellett döntöttem.)

# A funkció elkészítése
def listDirSpecial(userpath, usertext, userextension):
    import os
    files = os.listdir(userpath)
    for file in files:
    # Fájlnév-darabolás
        parts = file.split('.')
        fname = parts[0]
        ext = parts[-1]
    # Fájlnév-kiíratás
        if userextension == '':
            if usertext == '':
                print(fname)
            elif usertext.lower() in fname.lower():
                print(fname)
        elif usertext == '' and ext == userextension:
            print(fname)
        elif usertext.lower() in fname.lower() and ext == userextension:
            print(fname)
# A funkció futtatása
path = 'C:/sok_shape'
extension = ''
text = ''
listDirSpecial(path,text,extension)

A tesztelés másik hozadéka volt, hogy a kód kezelje, ha a kiterjesztés elválasztásán kívül is tartalmaz „.”-t fájlnév. Ehhez először megszámoltatom a szkripttel a fájlnévdarabokat, amiket a „.” mentén splittel már úgyis létrehoztam: „len”. Majd létrehoztam egy while ciklust, ami az utolsó előtti (p-1) fájlnévdarabig (tehát a kiterjesztésig) meghatározza a fájlnevet, akárhány „.” is legyen benne.

# A funkció elkészítése
def listDirSpecial(userpath, usertext, userextension):
    import os
    files = os.listdir(userpath)
    for file in files:
        # Fájlnév-darabolás és a darabok megszámolása
        parts = file.split('.')
        p = len(parts)
        fname = parts[0]
        ext = parts[-1]
        # Fájlnév-meghatározás
        i = 1
        while i < p-1:
            fname = fname + '.' + parts[i]
            i += 1
        # Fájlnév-kiíratás
        if userextension == '':
            if usertext == '':
                print(fname)
            elif usertext.lower() in fname.lower():
                print(fname)
        elif usertext == '' and ext == userextension:
            print(fname)
        elif usertext.lower() in fname.lower() and ext == userextension:
            print(fname)
# A funkció futtatása
path = 'C:/sok_shape'
text = ''
extension = ''
listDirSpecial(path,text,extension)

És már csak egy aprócska biztonsági intézkedés volt hátra: ha csak „path”-t ad meg a felhasználó (tehát a text = ''-t és extension = ''-t kihagyja) , akkor is értelmezhető legyen a funkció. Ehhez az „usertext” és „userextension” bemeneti paramétereknek alapértéket állítottam be: usertext = '', userextension = ''.

# A funkció elkészítése
def listDirSpecial(userpath, usertext = '', userextension = ''):
    import os
    files = os.listdir(userpath)
    for file in files:
        # Fájlnév-darabolás és a darabok megszámolása
        parts = file.split('.')
        p = len(parts)
        fname = parts[0]
        ext = parts[-1]
        # Fájlnév-meghatározás
        i = 1
        while i < p-1:
            fname = fname + '.' + parts[i]
            i += 1
        # Fájlnév-kiíratás
        if userextension == '':
            if usertext == '':
                print(fname)
            elif usertext.lower() in fname.lower():
                print(fname)
        elif usertext == '' and ext == userextension:
            print(fname)
        elif usertext.lower() in fname.lower() and ext == userextension:
            print(fname)
# A funkció futtatása
path = 'C:/sok_shape'
text = ''
extension = ''
listDirSpecial(path,text,extension)

A mostani cikk írása közben is újabb szempontok merültek fel bennem, így hamarosan folytatása következik.

Jó listázást!

Címkék:
© 2017 AdatTérKép