[QGIS-it-user] loop tra i file di una cartella in uno script processing

Salve a tutti

Sto scrivendo uno script di processing che dovrebbe applicare la stessa operazione matematica a ogni raster che si trova in una qualsiasi cartella.
Per comodità descrivo solo la parte che mi crea problemi nello script, spero possa bastare

Come prima cosa ho provato a settare la cartella con i file

def initAlgorithm(self, config=None):

self.addParameter(QgsProcessingParameterFile(name= self.INPUT,
description = self.tr(‘Folder input’),
behavior = 1,
extension = “.tif”))

def processAlgorithm(self,
parameters,
context,
feedback):

pathIn = self.parameterAsString(parameters,
self.INPUT,
context)

quindi stavo pensando di fare un loop nei file della cartella stessa.

for myFile in os.listdir(pathIn):
#etc

Il problema è che invece di fare il loop su tutti i file mi prende in considerazione solo l’ultimo della cartella.

Dove sbaglio?

grazie

Ciao Giacomo,
hai verificato se la variabile pathIn contiene un path valido di una cartella (e non di un file) prima dell'inizio del ciclo for?

In questo caso, puoi provare che os.listdir funzioni correttamente eseguendo nella console di Python:

for myFile in os.listdir(folderpath):
print(myFile)

Se tutto funziona come dovrebbe, allora probabilmente il problema è nel codice interno al ciclo for.

A presto.

Andrea

Il 09/02/2022 19:05, Giacomo Fontanelli ha scritto:

Salve a tutti
Sto scrivendo uno script di processing che dovrebbe applicare la stessa operazione matematica a ogni raster che si trova in una qualsiasi cartella.

Ciao Andrea
ho fatto come dicevi

il problema sta nel fatto che nonostante io creda di aver fornito il path di una cartella in verità mi viene riconosciuto solo l’ultimo file presente in questa.

Ci devo lavorare.

Grazie

Il giorno mer 9 feb 2022 alle ore 20:53 Andrea Giudiceandrea <andreaerdna@libero.it> ha scritto:

Ciao Giacomo,
hai verificato se la variabile pathIn contiene un path valido di una
cartella (e non di un file) prima dell’inizio del ciclo for?

In questo caso, puoi provare che os.listdir funzioni correttamente
eseguendo nella console di Python:

for myFile in os.listdir(folderpath):
print(myFile)

Se tutto funziona come dovrebbe, allora probabilmente il problema è nel
codice interno al ciclo for.

A presto.

Andrea

Il 09/02/2022 19:05, Giacomo Fontanelli ha scritto:

Salve a tutti
Sto scrivendo uno script di processing che dovrebbe applicare la
stessa operazione matematica a ogni raster che si trova in una
qualsiasi cartella.


QGIS-it-user mailing list
QGIS-it-user@lists.osgeo.org
https://lists.osgeo.org/mailman/listinfo/qgis-it-user

Il 09/02/2022 19:05, Giacomo Fontanelli ha scritto:

    pathIn = self\.parameterAsString\(parameters,
                                    self\.INPUT,
                                    context\)

quindi stavo pensando di fare un loop nei file della cartella stessa.

    for myFile in os\.listdir\(pathIn\):

#etc

Il problema è che invece di fare il loop su tutti i file mi prende in considerazione solo l'ultimo della cartella.

Dove sbaglio?

grazie

inizia con stampare sulla consolle i valori pathIn e della lista per vedere se sono corretti

prova anche a passare pathIn come testo (il nome della dir c:\myadir o roba simile) per vedere se va.

marcog

Ciao Marco

ho fatto come mi dicevi

la parte dello script incaricata di raccogliere i path di ingresso e di uscita funziona,

il problema sta nel loop all’interno dei file raster in una cartella, che invece di prendere in considerazione tutti i file si ferma al primo.

Se tolgo l’ultima riga ovvero

return {self.FOLDER: outRas[“OUTPUT”]}

lo script prende in considerazione tutti i file, altrimenti si ferma al primo

Non saprei

Grazie

Il giorno gio 10 feb 2022 alle ore 12:31 Marco Guiducci <marco.guiducci@regione.toscana.it> ha scritto:

Il 09/02/2022 19:05, Giacomo Fontanelli ha scritto:

pathIn = self.parameterAsString(parameters,
self.INPUT,
context)

quindi stavo pensando di fare un loop nei file della cartella stessa.

for myFile in os.listdir(pathIn):
#etc

Il problema è che invece di fare il loop su tutti i file mi prende in
considerazione solo l’ultimo della cartella.

Dove sbaglio?

grazie

inizia con stampare sulla consolle i valori pathIn e della lista per
vedere se sono corretti

prova anche a passare pathIn come testo (il nome della dir c:\myadir
o roba simile) per vedere se va.

marcog


QGIS-it-user mailing list
QGIS-it-user@lists.osgeo.org
https://lists.osgeo.org/mailman/listinfo/qgis-it-user

Il 10/02/2022 12:25, Marco Guiducci ha scritto:

inizia con stampare sulla consolle i valori pathIn e della lista per vedere se sono corretti

Ciao Marco,
credo che il tuo consiglio sia lo stesso che ho dato io. Ho capito male?

Il 10/02/2022 13:27, Giacomo Fontanelli ha scritto:

il problema sta nel loop all'interno dei file raster in una cartella, che invece di prendere in considerazione tutti i file si ferma al primo.

Se tolgo l'ultima riga ovvero

return {self.FOLDER: outRas["OUTPUT"]}

lo script prende in considerazione tutti i file, altrimenti si ferma al primo

Ciao Giacomo,
quindi, come ti scrivevo, il problema è proprio nel codice interno al ciclo for.

E' assolutamente normale che, se nel ciclo "for" interno alla funzione "processAlgorithm" c'è un'istruzione "return", allora in quel punto Python interrompa l'esecuzione del ciclo "for" e termina l'esecuzione della funzione "processAlgorithm.
Se tale istruzione "return" è nell'ultima riga del ciclo "for", questo, quindi, verrà eseguito inevitabilmente solo una volta e l'algoritmo terminerà l'esecuzione.

https://www.geeksforgeeks.org/python-return-statement/

A presto.

Andrea

Il 10/02/2022 18:26, Andrea Giudiceandrea ha scritto:

Il 10/02/2022 12:25, Marco Guiducci ha scritto:

inizia con stampare sulla consolle i valori pathIn e della lista per vedere se sono corretti

Ciao Marco,
credo che il tuo consiglio sia lo stesso che ho dato io. Ho capito male?

si, certo. non avevo visto la tua risposta.

mg

Salve
mi hanno fatto comodo le vostre osservazioni, in particolare che lo statement return provoca l’uscita da ogni loop.

Ho risolto mettendo i risultati che uscivano ad ogni loop da processing.run(‘qgis:rastercalculator’…
in una lista (myList) e alla fine

return {self.OUTPUT: myList}

Grazie

Il giorno ven 11 feb 2022 alle ore 10:58 Marco Guiducci <marco.guiducci@regione.toscana.it> ha scritto:

Il 10/02/2022 18:26, Andrea Giudiceandrea ha scritto:

Il 10/02/2022 12:25, Marco Guiducci ha scritto:

inizia con stampare sulla consolle i valori pathIn e della lista per
vedere se sono corretti

Ciao Marco,
credo che il tuo consiglio sia lo stesso che ho dato io. Ho capito male?

si, certo. non avevo visto la tua risposta.

mg


QGIS-it-user mailing list
QGIS-it-user@lists.osgeo.org
https://lists.osgeo.org/mailman/listinfo/qgis-it-user