Forum
>>
Principianti
>>
Primo programma e prime difficoltà
Pagina: 1 2 Avanti
Esegui il login per scrivere una risposta.
Scritto da titino2 |
2016-08-03 11:21:32 - Primo programma e prime difficoltà
|
Buongiorno a tutti,
sto cercando di fare uno script che faccia a grandi linee quello che in DOS farei scrivendo "dir *.tif". Dopo aver estratto la lista dei file *.tif di due cartelle vorrei fare un banale confronto dei nomi e trovare se sono uguali o diversi. Io ho iniziato semplicemente creando due cartelle dove dentro ho copiato due foto, fatto questo ho scritto questo semplice(per me già complesso) programmino che fa il confronto e mi dice se i nomi sono uguali o diversi: import os try: #assegno i path PathOld=(r'C:\LavoroCiclo_For\Dup2') PathNew=(r'C:\LavoroCiclo_For\Dup') #faccio un dir dei path fotoNew = os.listdir(PathNew) fotoTotal= os.listdir(PathOld) #converto in Tuple le liste provenienti da os.listdir foto=tuple(fotoNew) fotoT=tuple(fotoTotal) #verifico che i file abbiano lo stesso nome i=0 for i in range(0,2,1): if foto==fotoT: print "foto uguale: "+"New-->"+foto+" = "+"Old-->"+fotoT else: print "Foto Diverse: "+"New-->"+foto+" <> "+"Old-->"+fotoT except: print "Errore generico"Come dicevo lo script funziona, peccato che se complico un po le cose e ci sono altri tipi di file lui analizza anche quelli mentre io vorrei controllare solo quelli con un estensione che decido io (in questo caso .tif). Alla fine del tutto io vorrei avere due tuple contenenti tutti i nomi dei file .tif. Ultima e banalissima domanda: perché il ciclo For mi "cicla" solamente le tuple e non le liste? Ovvero se non converto in tuple "foto e fotoT" quando entro nel ciclo for mi si blocca (banale lo so..ma non riesco a capirlo). Grazie in anticipo... P.S. Il codice lo devo formattare in qualche modo particolare prima di postarlo? Se si vi chiedo scusa in anticipo e se mi dite come lo correggo... --- Ultima modifica di titino2 in data 2016-08-03 11:23:45 --- --- Ultima modifica di titino2 in data 2016-08-03 11:24:11 --- --- Ultima modifica di ㎝ in data 2016-08-03 11:31:30 --- |
|
Scritto da titino2 |
2016-08-04 18:56:18 - Re: Primo programma e prime difficoltà
|
Aggiornamento:
Ho fatto mille altre prove... ma vi risparmio il codice visto che i risultati sono come "una coperta corta"... Credo che ho bisogno di trovare un modo, una funzione o un'altra "diavoleria" per scorrere e selezionare i valori di una "lista o tupla" per crearne una risultante.(se ho una lista o tupla che contiene 5 file .txt e 3 file .tif vorrei creare la nuova lista con solo i 3 file .tif) Io non so come fare... mi sapete dare dei consigli? L'operatore " * " che uso in DOS in Python qual'è? C'è? Ci sto perdendo la testa... per favore aiutatemi anche con un semplice "stai sbagliando strada"... Grazie ancora... |
|
Scritto da Claudio_F |
2016-08-04 22:23:48 - Re: Primo programma e prime difficoltà
|
Si può usare filter per creare una nuova lista composta dai soli elementi per i quali la funzione is_tif_file ritorna True:
def is_tif_file(x): return os.path.isfile(x) and x.lower().endswith('.tif') fotoNew = filter(is_tif_file, os.listdir(PathNew)) fotoTotal = filter(is_tif_file, os.listdir(PathOld)) *** Il codice va evidenziato con il simbolo di fianco ai colori per non perdere l'indentazione *** |
|
Scritto da titino2 |
2016-08-09 00:01:15 - Re: Primo programma e prime difficoltà
|
Grazie mille per l'aiuto...
ho fatto come tu mi hai consigliato... pero incontro ancora delle difficoltà... ovvero ho capito cosa mi restituisce il codice che tu mi hai scritto ma non ho capito come usarlo perché se scrivo: import os try: #PATH PathOld=(r'C:\LavoroCiclo_For\Dup2') PathNew=(r'C:\LavoroCiclo_For\Dup') def is_tif_file(x): return os.path.isfile(x) and x.lower().endswith('.tif') fotoNew = filter(is_tif_file, os.listdir(PathNew)) fotoTotal = filter(is_tif_file, os.listdir(PathOld)) print fotoNew Risultato: [] Se invece di creare la funzione assegno "os.path.isfile(x) and x.lower().endswith('.tif')" ad una variabile e poi gioco con un "if is True" ecc.. riesco a selezionare solamente i file filtrati... ma... mi sarebbe piaciuto riuscire a creare fotoNew2 con solo i nomi dei file .tif. Mi puoi(potete) dare un'altra dritta? Perdonate la incompetenza... Grazie mille in anticipo |
|
Scritto da Claudio_F |
2016-08-09 18:39:21 - Re: Primo programma e prime difficoltà
|
Meglio che posti tutto il codice non funzionante (e ben formattato), non è ben chiaro neppure il discorso dell' if, cioè si può intuire l'idea, ma come l'hai scritta realmente no. Intanto la semplice funzione os.listdir(ecc ecc) riporta una lista contenente i nomi dei file? Ci sono anche i .tif? Se si allora si può vedere perché poi "non passano".
*** Il codice va evidenziato con il simbolo di fianco ai colori per non perdere l'indentazione *** |
|
Scritto da titino2 |
2016-08-09 22:58:24 - Re: Primo programma e prime difficoltà
|
Grazie mille per la risposta...
ho cercato di aggirare il problema ed ho prodotto questo script: # Import import os try: #PATH PathOld=(r'C:\LavoroCiclo_For\Dup2') PathNew=(r'C:\LavoroCiclo_For\Dup') PathMin=(r'C:\LavoroCiclo_For\Sottrai') #DIR fotoNew = os.listdir(PathNew) fotoTotal= os.listdir(PathOld) #Converto da List a Tuple la lista dei file nelle cartelle foto=tuple(fotoNew) fotoT=tuple(fotoTotal) i=0 l=0 l=len(foto) print "Lenght:",l for i in range(0,l,1): x=PathNew+"\\"+fotoNew re=os.path.isfile(x) and x.lower().endswith(".tif") if re is True: FotoM=foto fotoMinus1=FotoM[5:14] fotoMinus="M_"+fotoMinus1 Input_raster_or_constant_value_2 = PathOld+"\\"+foto Input_raster_or_constant_value_1 = PathNew+"\\"+foto Minus_tif1 = PathMin+"\\"+fotoMinus if os.path.exists(Input_raster_or_constant_value_2): print Input_raster_or_constant_value_1 print Input_raster_or_constant_value_2 print Minus_tif1 else: print x+"--> Non e' presente nelle foto totali" continue else: print "Non e' un .tif--> "+x except: print "Errore da analizzare"Spero di non averci messo troppi errori.. Vi prego... non esitate a criticare-consigliare e segnalare errori. Se mi spiegate come poter creare la famosa "lista o tupla" proveniente da un "Filter" ne sono moooolto contento... Grazie in anticipo... |
|
Scritto da Claudio_F |
2016-08-09 23:34:51 - Re: Primo programma e prime difficoltà
|
Allora, intanto a me interessava sapere, come chiesto nella precedente, se os.listdir ti riporta una lista contenente tutti i nomi compresi i .tif
Poi avere bisogno di una conversione in tupla è già indice di qualcosa di molto strano. Quale sia questa cosa è praticamente impossibile da capire visto che hai forzatamente silenziato tutti gli errori. Ad esempio: x = PathNew + "\\" + fotoNewè un chiaro: TypeError: cannot concatenate 'str' and 'list' objectse infatti non ha alcun senso concatenare una stringa con una lista. Gli errori non vanno mai silenziati, soprattutto in fase di sviluppo. *** Il codice va evidenziato con il simbolo di fianco ai colori per non perdere l'indentazione *** |
|
Scritto da titino2 |
2016-08-12 20:23:30 - Re: Primo programma e prime difficoltà
|
Grazie mille per la risposta e scusa per il ritardo della mia.. Ma sono in vacanza..
Anche se non ho il pc sotto mano provo a risponderti.. Il listdir mi restituisce una lista di tutti i file contenuti nella cartella.. Quindi quello funziona bene.. Per quanto riguarda la conversione in tupla e una cosa che mi e rimasta dalla prima stesura del codice perché non riuscivo a far funzionare il "for" con le list (ora ho capito come si fa).. Ma e un problema fare una conversione in tupla? Sinceramente, teoria a parte, non ho capito i grandi pro e contro tra list e tuple (es. Nel mio caso cosa mi cambierebbe?). Per la soppressione degli errori.. Anche qui hai ragione.. Sono alle prime armi e credevo di convogliare tutti gli errori in uno generico.. Perdono.. |
|
Scritto da titino2 |
2016-08-22 15:55:05 - Re: Primo programma e prime difficoltà
|
Purtroppo le vacanze sono finite...
Ho riprovato il mio script e corretto gli errorini che mi avevate segnalato (tipo la conversione in tuple e str+str). Per quanto riguarda la funzione os.listdir(path) mi restituisce tutta la lista dei file contenuti all'interno del path comprese le estensioni, quindi mi pare funzionare correttamente, ma la funzione ed il successivo "filter" che mi avete consigliato non riesco proprio a farli funzionare. Sotto vi metto un estrazione dello script che uso per fare le prove... Mi sapete dire dove sbaglio? import os def is_tif_file(x): return os.path.isfile(x) and x.lower().endswith('.tif') File=os.listdir(r'C:\LavoroCiclo_For\Dup') print File fotoNew = filter(is_tif_file, os.listdir(r'C:\LavoroCiclo_For\Dup')) File2= fotoNew print File2 >>> ['Nuovo Documento di Microsoft Office Word.docx', 'Nuovo Documento di testo.txt', 'Foto1.tif', 'Foto2.tif', 'Foto3.tif'] [] >>> |
|
Scritto da titino2 |
2016-08-23 15:32:00 - Re: Primo programma e prime difficoltà
|
Aggiornamento:
Dopo un po di prove(fatte a caso... :dont-know vi metto due esempi: ##__________PROVA_1 import os path=(r'C:\LavoroCiclo_For\Dup2') def prova1(x): return os.path.isfile(x) and x.lower().endswith('tif') def prova2(y): return os.path.isfile(y) and y.lower().endswith('tif') ar1=filter(prova1,os.listdir(path)) ar2=filter(prova2,os.listdir(path)) print ar1 print ar2 ##RISULTATO## [] [] ##_________PROVA_2 import os path=(r'C:\LavoroCiclo_For\Dup2') def prova1(x): return os.path.isfile and x.lower().endswith('tif') def prova2(y): return os.path.isfile and y.lower().endswith('tif') ar1=filter(prova1,os.listdir(path)) ar2=filter(prova2,os.listdir(path)) print ar1 print ar2 ##RISULTATO## ['Foto1.tif', 'Foto2.tif', 'Foto3.tif'] ['Foto1.tif', 'Foto2.tif', 'Foto3.tif']Concludendo mi sento di dire che la funzione "os.path.isfile" non accetta un argomento (sinceramente non capisco come mai visto che richiederebbe un "path"). Comunque con la "prova2" il risultato è corretto ed è quello che mi aspettavo. Vi vorrei richiedere un dubbio da neofita totale... nel mio caso che differenza c'è ad usare "list" o "tuple"? Grazie ancora a tutti |
Pagina: 1 2 Avanti
Esegui il login per scrivere una risposta.