Forum >> Principianti >> Primo programma e prime difficoltà

Pagina: 1 2 Avanti

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 ---
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...

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 ***
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



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 ***
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...






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' objects
e 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 ***
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..



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']
[]
>>> 

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.