[Python] chiarimento valore ritornato da una funzione

Leonardo M. Millefiori mystixx22 a gmail.com
Lun 30 Maggio 2011 14:37:19 CEST


Il 30/05/2011 14:28, Massimo Capanni ha scritto:
> In effetti quella che ho postato e' la prima versione del programma,
> abbastanza *rozza* :)
> 
> Vedo di sperimentare i tuoi suggerimenti, grazie
> 
> 
> Il 30 maggio 2011 14:16, Lorenzo Sutton <lsutton a libero.it> ha scritto:
>> Ciao Massimo,
>>
>> Massimo Capanni wrote:
>>> Buongiorno a tutti,
>>>
>>> ho appena realizzato una funzione che ha uno strano comportamento a
>>> seconda di un certo input.
>>>
>>> La funzione e' questa:
>>>
>>> =======================================
>>> def subfolder(cartella):
>>>     sotto_cartelle = [] # ritorna una lista di cartelle
>>>     stop = 0 # livello di profondita' delle sottocartelle
>>>     for root, dirs, files in os.walk(cartella):
>>>         if stop == 1:
>>>             return sotto_cartelle
>>>         else:
>>>             for i in dirs:
>>>                 sotto_cartelle.append(os.path.join(root,i))
>>>             stop = stop + 1
>>>     return sotto_cartelle (X)
>>> =======================================
>>>
>>> in pratica passo alla funzione una cartella e mi restituisce una lista
>>> delle sottocartelle di primo livello nell'albero della directory.
>> Sei sicuro che non si possa fare in maniera pił semplice per avere solo
>> il primo sotto-livello?
>>
>> - Sempre con os.walk in teoria ti basta una sola riga... Considera il
>> secondo elemento della prima tripla che ottieni (fai delle prove con print)
>>
>> - Oppure considera os.listdir combinato con os.path.isdir ...
>>
>> In entrambi i casi occhio ai path relativi VS path assoluti a seconda di
>> quello che devi fare e dell'input che dai alla funzione.
>>
>> Giusto per darti un altro punto di vista ;)
>>
>> Lorenzo.
>>> Ad esempio:
>>> cartella = c:
>>>
>>> Sottocartelle:
>>> c:\pippo
>>> c:\pluto
>>> c:\paperino
>>> ...
>>>
>>> Successivamente eseguo questa porzione di codice in una parte del programma,
>>> con il quale ricavo le sottocartelle di ogni sottocartella di primo livello:
>>>
>>> =======================================
>>>     lista_cartelle = [] # lista delle
>>>     temp  = []
>>>     temp2 = []
>>>
>>>     temp = subfolder(cartella) # inserisco la lista delle cartelle di
>>> primo livello
>>>
>>>     for i in temp:
>>>         temp2 = []
>>>         temp2 = subfolder(i) # contiene la lista delle sottocartelle
>>> della cartella 'i'
>>>
>>>         for j in temp2:
>>>             lista_cartelle.append(j)
>>> =======================================
>>>
>>> adesso succede che se ometto dalla funzione subfolder() la riga
>>> segnata con (X) [return sotto_cartelle], il programma si blocca con un
>>> errore perche' se una delle sottocartelle di primo livello e' vuota,
>>> il ciclo "for j in temp2" si ferma con un Nonetype error.
>>>
>>> Tuttavia se inserisco la riga (X) di ritorno del valore il programma funziona.
>>> Quello che non capisco e' che in ogni caso dovrei trovare una cartella
>>> vuota e non un valore None.
>>>
>>> Avete idea di questo strano comportamento?
>>>
>>> massimo
>>> _______________________________________________
>>> Python mailing list
>>> Python a lists.python.it
>>> http://lists.python.it/mailman/listinfo/python
>>>
>> _______________________________________________
>> Python mailing list
>> Python a lists.python.it
>> http://lists.python.it/mailman/listinfo/python
>>
> _______________________________________________
> Python mailing list
> Python a lists.python.it
> http://lists.python.it/mailman/listinfo/python

Di recente ho avuto la tua stessa esigenza. Visto che si accettano
suggerimenti, ecco la mia soluzione per ottenere la lista delle sotto
cartelle di primo livello.

def subfolders(path):
	l = [i for i in os.listdir(path) if os.path.isdir(i)]
	return l

Saluti
LMM


Maggiori informazioni sulla lista Python