Gentoo Forums
Gentoo Forums
Gentoo Forums
Quick Search: in
[SCRIPT PYTHON] Exif Organizer
View unanswered posts
View posts from last 24 hours
View posts from last 7 days

Goto page 1, 2  Next  
Reply to topic    Gentoo Forums Forum Index Forum italiano (Italian) Risorse italiane (documentazione e tools)
View previous topic :: View next topic  
Author Message
xoen
Guru
Guru


Joined: 06 Sep 2003
Posts: 472
Location: /dev/null

PostPosted: Wed Jan 12, 2005 12:08 am    Post subject: [SCRIPT PYTHON] Exif Organizer Reply with quote

Sono quasi fiero di me...dopo cena mi sono messo a smanettare con python, mai visto...ora ho scritto uno script che fà quello che mi serviva!!
Potrebbe interessare a qualcun'altro perciò eccovelo.

PROBLEMA : Ho una Canon Powershot A60, con Win* scaricavo le foto con il software in dotazione, ed avevo la possibilità di metterle automaticamente in delle directory in base alla data di scatto, automaticamente. Questo era molto comodo, avevo ad esempio le foto del 30/07/2004 nella directory 2004_07_30, quelle del 15/08/2004 nella directory 2004_08_15 e così via...con linux non avevo questa possibilità (penso)

Ho scritto questo script in python che controlla se un file contiene informazioni EXIF con file
Code:

$ file nome_file

In tal caso, usa il comando exiftags per estrarre la data di scatto della foto :
Code:

exiftags | grep "Image Created"

Infine crea la directory in base alla data di scatto e vi copia dentro il file.

SPECIFICARE UNA DIRECTORY : Di default lo script crea le directory delle foto in ".", ma è possibile specificare una directory :
Code:

exif-organizer -d /una/directory lista_file_da_organizzare


DOWNLOAD : E' possibile scaricare lo script da quì :
http://xoen.altervista.org/download/exif-organizer.py (Tradotto da Codadilupo).

"INSTALLAZIONE" : Vi serve il comando exiftags, per cui se non ce l'avete ... sono neache 50 KB :
Code:
emerge exiftags

Poi potreste copiare il file scaricato in /usr/bin/ (da root) (modificate il valore della variabile "directory" se volete) :
Volendo potete anche creare un link :
Code:

# ln -s /usr/bin/exif-organizer.py exif-organizer


USO : Scaricate le foto in una directory, fatto ciò basterà dare il comando da questa directory :
Code:

$ exif-organizer.py *

o se preferite :
Code:

$ exif-organizer.py -d /una/dir *

se volete copiare (e non spostare) le foto usate l'opzione -c (--copy) :
Code:

$ exif-organizer.py -c *

Vi ritroverete le foto suddivise per data.

Se volete potete vedere l'help
Code:

$ exif-organizer.py --help




SCRIPT (EXIF Organizer) : Ecco lo script, il mio primo script, l'ho commentato in modo tale da essere il più comprensibile possibile, spero vi piaccia :
Code:

#! /usr/bin/env python
# -*-  encoding: UTF-8  -*-
# Thanks to Eric M. Johnston for the exiftags utility

import sys
import os
import shutil
import string
import optparse


program_version = """Exif Organizer - 0.5   2005/01/13
EO organizes your photos following the creation date.
It uses exiftags, written by Eric M. Johnston (thanks to him!
\nCopyright (C) 2005  Aldo \"Xoen\" Giambelluca <aldo.giambelluca@email.it>
This script is licensed under the GPL (www.gnu.org)"""


def copy() :
    shutil.copy (filename,dest_dir)
   

def move() :
    shutil.move (filename,dest_dir)


# filename contain EXIF info?
def hasEXIF(filename) :
    # Call the command "file" on filename
    # $ file filename
    file_result = os.popen ("file "+filename).readline()
    if (string.find(file_result,"EXIF")!=-1) :
        return True
    else :
        return False


# Return the shot date of filename (in the form YYYY_MM_DD)
def getShotDate(filename) :
        # Read the TAG value "Image Created" from the file with exiftags and grep
        # $ exiftags nome_file | grep "Image Created"
        # We obtain something like :
        # "Image Created: 2003:10:18 21:39:13"
        shot_date = os.popen ("exiftags "+filename+" | grep \"Image Created\"")
        shot_date = shot_date.readline()

        # Directory's name should be as :
        # YYYY_MM_DD
        return shot_date[15:19]+"_"+shot_date[20:22]+"_"+shot_date[23:25]




# Command line options/argumens management
parser = optparse.OptionParser(usage="%prog [OPTIONS] files", version=program_version)
parser.add_option ("-d", "--directory", dest="directory", default=".", metavar="DIR", help="Specify the directory where to store the images")
parser.add_option ("-c", "--copy", dest="copy", action="store_true", default=False, help="Copy the files instead move the files")
options, file_list = parser.parse_args()

if (len(file_list)==0) :
    print ("Specify one or more files to organize!!\a")
    sys.exit(-1)

if (not os.path.isdir(options.directory)) :
    print ("ERROR: The directory \""+options.directory+"\" NOT exists!!\a")
    sys.exit (-1)

# copy_move function copy or move (depends from -c option)
if (options.copy) :
    copy_move = copy
else :
    copy_move = move




for filename in file_list :
    # If the file contains EXIF infos we go on
    if (hasEXIF(filename)) :
        # Read the shot date of the file
        shot_date = getShotDate(filename)

        # Create the directory (if not exists) :
        dest_dir = os.path.join(options.directory,shot_date)
        if (not os.path.exists(dest_dir)) :
            try :
                os.mkdir (dest_dir)
            except :
                print ("ERROR : Cannot create "+dest_dir+" directory\a")

        # ...and moves/copies the file(s) into :
        try :
            copy_move()
            print (filename+" .... OK")
        except :
            print (filename+" .... ERROR\a")
    elif (os.path.isfile(filename)) :
        # If the file doesn't contain EXIF infos we give out
        print ("WARNING : The file \""+filename+"\" doesn't contain EXIF infos.\a")




PS: Se in poche ore uno qualsiasi riesce a scrivere uno script che fà il suo dovere, allora posso affermare che Python è un bellissimo linguaggio di scripting! Molto semplice e pulito.
_________________
xoen.Blog()
god@paradise # tar xfvjp big-bang.tar.bz2 -C universe


Last edited by xoen on Thu Jan 13, 2005 10:42 pm; edited 9 times in total
Back to top
View user's profile Send private message
xchris
Advocate
Advocate


Joined: 10 Jul 2003
Posts: 2824
Location: 45.488291,9.186094

PostPosted: Wed Jan 12, 2005 8:22 am    Post subject: Reply with quote

posso ben comprendere il tuo entusiasmo per python.
Ha avuto lo stesso effetto con me :)

Purtroppo io non ho la necessita' di organizzare le foto in questo modo...
Volevo solo incoraggiarti a proseguire con python e ricordarti la regola N°1

Code:

pydoc -p 1080


http://localhost:1080

ciao ;)
_________________
while True:Gentoo()
Back to top
View user's profile Send private message
xoen
Guru
Guru


Joined: 06 Sep 2003
Posts: 472
Location: /dev/null

PostPosted: Wed Jan 12, 2005 1:18 pm    Post subject: Reply with quote

Visto che ci sono volevo consigliare www.zonapython.it, contiene molta documentazione, in italiano.

PS: Qualche opinione sullo script? Come vi sembra? C'è qualcosa che non và?
_________________
xoen.Blog()
god@paradise # tar xfvjp big-bang.tar.bz2 -C universe
Back to top
View user's profile Send private message
mouser
Veteran
Veteran


Joined: 10 Aug 2004
Posts: 1418
Location: Milano

PostPosted: Wed Jan 12, 2005 4:23 pm    Post subject: Reply with quote

Dovro' mettermi anch'io a lavorare un po' con python, visto che cerco di smanettare un po' in bash, ma con scarsi risultati :cry:
Solo un'appuntino: magari per la selezione della directory ti conviene gestirla da linea di comando.... non so quanti user si prendono la briga di modificare il codice python :lol:
Per il resto, scriptino interessante.

Ciriciao
mouser :wink:
_________________
Della serie: "Informatica for dummies":

Io: "Premi il tasto Invio" - Risp: "Ma il tasto Invio è quello con scritto Enter sopra?"
Io: "Scrivi T maiuscolo" - Risp: "Questa tastiera non ha le lettere maiuscole..."
Back to top
View user's profile Send private message
xoen
Guru
Guru


Joined: 06 Sep 2003
Posts: 472
Location: /dev/null

PostPosted: Wed Jan 12, 2005 4:30 pm    Post subject: Reply with quote

mouser wrote:
Solo un'appuntino: magari per la selezione della directory ti conviene gestirla da linea di comando.... non so quanti user si prendono la briga di modificare il codice python :lol:

Hai ragione..perfettamente, solo che era tardi ed ho evitato..visto che funzionava...e visto che ho pensato che c'è sicuramente qualche soluzione migliore per gestire i parametri (o no? Se qualcuno ha dei consigli...). Quindi ho fatto quella modifica "stupida" e volendo uno può ottenere lo stesso risultato (con un parametro -d sarebbe più flessibile..)

Grazie per il parere.
_________________
xoen.Blog()
god@paradise # tar xfvjp big-bang.tar.bz2 -C universe
Back to top
View user's profile Send private message
codadilupo
Advocate
Advocate


Joined: 05 Aug 2003
Posts: 3134

PostPosted: Wed Jan 12, 2005 4:39 pm    Post subject: Reply with quote

ottimo, e lo usero' ;-)
Una cosa: magari mettilo in inglese (tanto son quattro righe!): sicuramente verrebbe comodo anche a qualcuno la' fuori ;-)

Coda
_________________
# emerge -C gelmini
Back to top
View user's profile Send private message
xoen
Guru
Guru


Joined: 06 Sep 2003
Posts: 472
Location: /dev/null

PostPosted: Wed Jan 12, 2005 4:46 pm    Post subject: Reply with quote

codadilupo wrote:
ottimo, e lo usero' ;-)

Davvero? Ottimo! Se può essere utile a 2 persone non è stato lavoro inutile ;) Fammi sapere cosa ne pensi, se ti funziona bene, o se hai qualche problema (Niente è perfetto).
L'ho provato con i file della mia Canon A60 e della Sony DSC-P32 della mia ragazza e fa il suo lavoro.
_________________
xoen.Blog()
god@paradise # tar xfvjp big-bang.tar.bz2 -C universe
Back to top
View user's profile Send private message
mouser
Veteran
Veteran


Joined: 10 Aug 2004
Posts: 1418
Location: Milano

PostPosted: Wed Jan 12, 2005 4:48 pm    Post subject: Reply with quote

codadilupo wrote:

Una cosa: magari mettilo in inglese (tanto son quattro righe!): sicuramente verrebbe comodo anche a qualcuno la' fuori

Giusto!!! Non che non apprezzi il fatto che noi italiani produciamo software, ma internazionalizzare rende il software disponibile a tutti.
Inoltre, a meno che non sia sufficiente un emerge puro e semplice, scrivi un filettino con le note di installazione e due righe su come installare exiftags.

ps: magari se hai un account su altervista.org o similari ti converrebbe metterlo online 8)

My 2 eurocent
Ciriciao
mouser :wink:
_________________
Della serie: "Informatica for dummies":

Io: "Premi il tasto Invio" - Risp: "Ma il tasto Invio è quello con scritto Enter sopra?"
Io: "Scrivi T maiuscolo" - Risp: "Questa tastiera non ha le lettere maiuscole..."
Back to top
View user's profile Send private message
codadilupo
Advocate
Advocate


Joined: 05 Aug 2003
Posts: 3134

PostPosted: Wed Jan 12, 2005 4:55 pm    Post subject: Reply with quote

qualcosa tipo questo, per intenderci ;-)

Code:
#! /usr/bin/env python
# -*-  encoding: UTF-8  -*-

# thanks to Eric M. Johnston for the exiftags utility

import sys
import os
import string

# Change here the root directory
# es. /home/xoen/album_photo/
# mind the last "/" otherwise it does not work!
directory = "./"


def program_version() :
    print ("Exif Organizer - 0.2   2005/01/12")


def program_info() :
    program_version()
    print ("EO organizes your photos following the creation date.")
    print ("It uses exiftags, coded by Eric M. Johnston (thanks to him!).")
    print ("\nCopyright (C) 2005  Aldo (Xoen) Giambelluca <aldo.giambelluca@email.it>")
    print ("This script is licensed under the GPL (www.gnu.org)")


def program_usage():
    print ("Use: exif-organizer [FILE]...");
    print ("   -h, --help\t\tShows this help")
    print ("   -v, --version\tShows the version")



if ((len(sys.argv)==1) or (sys.argv[1] in ["--help", "-h"])) :
    program_usage()
    sys.exit (0)


if (sys.argv[1] in ["--version", "-v"]) :
    program_info()
    sys.exit (0)



for nome_file in sys.argv[1:] :
    # Call the command "file" on nome_file
    # $ file nome_file
    file_nome_file = os.popen ("file "+nome_file).readline()
    # If the file contains EXIF infos we go on
    if (string.find(file_nome_file,"EXIF")!=-1) :
        # We read the TAG value "Image Created" from the file with exiftags and grep
        # $ exiftags nome_file | grep "Image Created"
        data_scatto = os.popen ("exiftags "+nome_file+" | grep \"Image Created\"")
        data_scatto = data_scatto.readline()
        # We should obtain something like :
        # Image Created: 2003:10:18 21:39:13

        # Directory's name should be as :
        # AAAA_MM_GG
        data_scatto = data_scatto[15:19]+"_"+data_scatto[20:22]+"_"+data_scatto[23:25]

        # Create the directory :
        # $ mkdir data_scatto
        os.popen ("mkdir "+directory+data_scatto)

        # ...and copies the file(s) into :
        # $ mv nome_file data_scatto
        os.popen ("mv "+nome_file+" "+directory+data_scatto)
        print (nome_file+" .... OK")
    else :
        # If the file doesn't contain EXIF infos we give out
        print ("WARNING : The file \""+nome_file+"\" does not report any EXIF infos.\a")


P.S.: leggendolo ho notato una cosa: tu fai il controllo se il file contiene informazioni di tipo EXIF, e poi procedi, ma solo alla fine specifichi cosa fare se non le contirene: ora, io non so assolutamente nulla di programmazione, ma non sarebbe piu' semplice controllare se il file NON contiene informazioni EXIF "prima", e uscire subito, nel caso ? In 30 righe di codice non cambia nulla, ovvio, solo una mia curiosità ;-)
P.P.S.: sicuramente l'indentazione é andata a farsi benedire ;-)

Coda
_________________
# emerge -C gelmini
Back to top
View user's profile Send private message
mouser
Veteran
Veteran


Joined: 10 Aug 2004
Posts: 1418
Location: Milano

PostPosted: Wed Jan 12, 2005 5:04 pm    Post subject: Reply with quote

Si, in effetti leggendo il codice ci avevo fatto caso anch'io.

Come dice coda, su uno script di questo tipo neanche un
Code:

# time; exif-organizer [FILE];time

ti visualizza un cambiamento, ma l'etica (e chiedo scusa a coda se rubo uno dei 3 termini tabu :lol: ) del programmatore prevede un controllo anticipato sui casi di errore, dopodiche' si procede con il programma.
Per fare un esempio: se fai un programma che funziona se hai sia A che B, ma non funziona se hai C, una buona programmazione dice di fare:
Code:

E' presente C? ----> Esci
E' presente B? ----> Continua
\-----------> E' mancante A? ----> Esci
Continua il programma

Spero di essere stato chiaro :lol:

mouser :wink:
_________________
Della serie: "Informatica for dummies":

Io: "Premi il tasto Invio" - Risp: "Ma il tasto Invio è quello con scritto Enter sopra?"
Io: "Scrivi T maiuscolo" - Risp: "Questa tastiera non ha le lettere maiuscole..."
Back to top
View user's profile Send private message
xoen
Guru
Guru


Joined: 06 Sep 2003
Posts: 472
Location: /dev/null

PostPosted: Wed Jan 12, 2005 5:16 pm    Post subject: Reply with quote

mouser wrote:
Inoltre, a meno che non sia sufficiente un emerge puro e semplice, scrivi un filettino con le note di installazione e due righe su come installare exiftags.

ps: magari se hai un account su altervista.org o similari ti converrebbe metterlo online 8)

Si avevo dimenticato di scrivere che serviva un
Code:
emerge exiftags
...l'ho aggiunto ora.
Ho messo lo script online (Pero' stranamente il link non funziona, pero' se copiate l'indirizzo và tutto ok, perchè?boh...politica di Altervista?o è il BB-Code?)
_________________
xoen.Blog()
god@paradise # tar xfvjp big-bang.tar.bz2 -C universe
Back to top
View user's profile Send private message
mouser
Veteran
Veteran


Joined: 10 Aug 2004
Posts: 1418
Location: Milano

PostPosted: Wed Jan 12, 2005 5:18 pm    Post subject: Reply with quote

Mah, non saprei, comunque altervista fa quasi sempre cosi', credo sia un problema suo :lol:
_________________
Della serie: "Informatica for dummies":

Io: "Premi il tasto Invio" - Risp: "Ma il tasto Invio è quello con scritto Enter sopra?"
Io: "Scrivi T maiuscolo" - Risp: "Questa tastiera non ha le lettere maiuscole..."
Back to top
View user's profile Send private message
xoen
Guru
Guru


Joined: 06 Sep 2003
Posts: 472
Location: /dev/null

PostPosted: Wed Jan 12, 2005 5:26 pm    Post subject: Reply with quote

codadilupo wrote:
qualcosa tipo questo, per intenderci ;-)

Code:
#! /usr/bin/env python
# -*-  encoding: UTF-8  -*-

# thanks to Eric M. Johnston for the exiftags utility

import sys
import os
import string

# Change here the root directory
# es. /home/xoen/album_photo/
# mind the last "/" otherwise it does not work!
directory = "./"


[ECC ECC...]


Grazie per la traduzione :)

codadilupo wrote:
P.S.: leggendolo ho notato una cosa: tu fai il controllo se il file contiene informazioni di tipo EXIF, e poi procedi, ma solo alla fine specifichi cosa fare se non le contirene: ora, io non so assolutamente nulla di programmazione, ma non sarebbe piu' semplice controllare se il file NON contiene informazioni EXIF "prima", e uscire subito, nel caso ? In 30 righe di codice non cambia nulla, ovvio, solo una mia curiosità ;-)
P.P.S.: sicuramente l'indentazione é andata a farsi benedire ;-)

Boh...non ho capito.
Attenzione all'indentazione, in python non è semplicemente una questione estetica.

mouser wrote:
Come dice coda, su uno script di questo tipo neanche un
Code:

# time; exif-organizer [FILE];time

ti visualizza un cambiamento, ma l'etica (e chiedo scusa a coda se rubo uno dei 3 termini tabu :lol: ) del programmatore prevede un controllo anticipato sui casi di errore, dopodiche' si procede con il programma.
Per fare un esempio: se fai un programma che funziona se hai sia A che B, ma non funziona se hai C, una buona programmazione dice di fare:
Code:

E' presente C? ----> Esci
E' presente B? ----> Continua
\-----------> E' mancante A? ----> Esci
Continua il programma

Spero di essere stato chiaro :lol:

Ehm..chiaro..veramente non ho capito...secondo voi è poco efficiente? dovrei invertire la condizione? Boh...io l'ho fatto apposta, perchè è più probabile che se uno richiama lo script ci sono più file con informazioni EXIF che file non EXIF (Spero di essere stato chiaro...o no?boh...)
_________________
xoen.Blog()
god@paradise # tar xfvjp big-bang.tar.bz2 -C universe
Back to top
View user's profile Send private message
codadilupo
Advocate
Advocate


Joined: 05 Aug 2003
Posts: 3134

PostPosted: Wed Jan 12, 2005 5:32 pm    Post subject: Reply with quote

xoen wrote:
Grazie per la traduzione :)


figurati ;-)

Quote:
Attenzione all'indentazione, in python non è semplicemente una questione estetica.


lo so, ma non modo di verificarla, ora: sono su winzozz. Per questo ho messo le mani avanti ;-)

Quote:
Ehm..chiaro..veramente non ho capito...secondo voi è poco efficiente? dovrei invertire la condizione? Boh...io l'ho fatto apposta, perchè è più probabile che se uno richiama lo script ci sono più file con informazioni EXIF che file non EXIF (Spero di essere stato chiaro...o no?boh...)


Non é fondamentale: é solo una regola non scritta: quando scrivi una procedura, per risparmiare tempo, verifichi prima di tutto se é il caso di andare avanti, piu' tosto che finire subito. Succede anche nella vita vera ;-) Per esempio, quando vai in comune per richiedere un certificato, PRIMA ti chiedono tutti i documenti, i fogli, i bolli, etc.. e se ci sono, allora comincia il programma.. ehmm.. il lavoro per farti il certificato: é solo che il cervello é pigro, ma tanto, e le cerca tutte prima di lavorare ;-)

Coda
_________________
# emerge -C gelmini
Back to top
View user's profile Send private message
mouser
Veteran
Veteran


Joined: 10 Aug 2004
Posts: 1418
Location: Milano

PostPosted: Wed Jan 12, 2005 5:35 pm    Post subject: Reply with quote

codadilupo wrote:

allora comincia il programma.. ehmm.. il lavoro per farti il certificato

deformazione gentooistica ??? :lol:

Non volevo incasinare la vita a nessuno, solo che, come ha detto coda, in questo script non noterai nessuna differenza in quanto a prestazioni, ma in generale e' meglio controllare prima tutto quello che ci deve (o non deve) essere per far funzionare un programma.
Poi se i controlli sono risultati positivi (o negativi a seconda del controllo) allora continua il programma.

Cerco di essere un po' piu' chiaro: e' inutile che un'eventuale altro programmatore che legge il tuo script si debba leggere tutto lo script e poi, alla fine, si trova qualcosa che dice "Se non puoi fare tutto quello che ho scritto finora, allora fai questo"! E' meglio che prima controlli che il programma possa essere eseguito, ed in tal caso lo esegui!

mouser :wink:
_________________
Della serie: "Informatica for dummies":

Io: "Premi il tasto Invio" - Risp: "Ma il tasto Invio è quello con scritto Enter sopra?"
Io: "Scrivi T maiuscolo" - Risp: "Questa tastiera non ha le lettere maiuscole..."
Back to top
View user's profile Send private message
xoen
Guru
Guru


Joined: 06 Sep 2003
Posts: 472
Location: /dev/null

PostPosted: Wed Jan 12, 2005 5:42 pm    Post subject: Reply with quote

codadilupo wrote:
Non é fondamentale: é solo una regola non scritta: quando scrivi una procedura, per risparmiare tempo, verifichi prima di tutto se é il caso di andare avanti, piu' tosto che finire subito. Succede anche nella vita vera ;-) Per esempio, quando vai in comune per richiedere un certificato, PRIMA ti chiedono tutti i documenti, i fogli, i bolli, etc.. e se ci sono, allora comincia il programma.. ehmm.. il lavoro per farti il certificato: é solo che il cervello é pigro, ma tanto, e le cerca tutte prima di lavorare ;-)

Solitamente per risparmiare tempo si verifica prima la condizione più probabile, in questo caso che il file contenga l'informazione EXIF. Sono convinto che stiamo dicendo la stessa cosa, ma non ci stiamo capendo :)

Questo if :
Code:

if (string.find(file_nome_file,"EXIF")!=-1) :
        # Viene letto il valore del Tag "Image Created" dal file con exiftags e grep

Si può leggere com "Se nel file ci sono informazioni EXIF :", solitamente è così e si passa subito al blocco dell'if, se non è così (meno probabile) allora viene eseguito il blocco "else :".

C'è qualcosa che non và? Cosa proponete? :idea:
_________________
xoen.Blog()
god@paradise # tar xfvjp big-bang.tar.bz2 -C universe
Back to top
View user's profile Send private message
xchris
Advocate
Advocate


Joined: 10 Jul 2003
Posts: 2824
Location: 45.488291,9.186094

PostPosted: Wed Jan 12, 2005 5:47 pm    Post subject: Reply with quote

un link che puo' tornare comodo:
http://home.cfl.rr.com/genecash/digital_camera.html

cosi' puoi anche catalogare le immagini secondo altri criteri ;)

consiglio:usa le funzioni di python con trap delle eccezioni per creare le dir e spostare i file

ciao e happy python :)
_________________
while True:Gentoo()
Back to top
View user's profile Send private message
xoen
Guru
Guru


Joined: 06 Sep 2003
Posts: 472
Location: /dev/null

PostPosted: Wed Jan 12, 2005 5:49 pm    Post subject: Reply with quote

mouser wrote:
Cerco di essere un po' piu' chiaro: e' inutile che un'eventuale altro programmatore che legge il tuo script si debba leggere tutto lo script e poi, alla fine, si trova qualcosa che dice "Se non puoi fare tutto quello che ho scritto finora, allora fai questo"! E' meglio che prima controlli che il programma possa essere eseguito, ed in tal caso lo esegui!

Modificando la condizione dell'if al contrario succederebbe questo :

Sono in una dir.
Eseguo lo script :
Code:

exif-organizer *

Nella dir ci sono 1000 immagini Jpeg con EXIF, 10 altri file, 3 directory...

Lo script esegue un for per 1013 "oggetti".
Se modifico l'if, lo script per 1000 volte salterebbe all'else, perdendo tempo...invece così com'è questo avviene soltanto 13 volte...spero di essermi spiegato, e di aver capito cosa volevate dire. :roll:
_________________
xoen.Blog()
god@paradise # tar xfvjp big-bang.tar.bz2 -C universe
Back to top
View user's profile Send private message
mouser
Veteran
Veteran


Joined: 10 Aug 2004
Posts: 1418
Location: Milano

PostPosted: Wed Jan 12, 2005 5:50 pm    Post subject: Reply with quote

Il problema e' questo: non c'e' niente che non va a livello implementativo, ma per quanto riguarda gli standard logici di programmazione e' piu logico:

"Se nel file NON ci sono informazioni EXIF esci, altrimenti (ELSE) continui con il tuo script:"

Poiche' in questo modo verifichi prima che tutte le condizioni per l'esecuzione del codice siano ok, dopodiche' lo esegui.

Poi, assolutamente, nulla ti vieta di lasciare lo script cosi' com'e'; ti dico solo, come programmatore, che se dovessi modificare per le mie esigenze il tuo script, la prima cosa che farei sarebbe di invertire proprio questa condizione

mouser :wink:

edit: cribbio se sei veloce a scrivere. Comunque, per prima cosa lo script dovrebbe andare ad eseguire il ciclo for solo per i file immagini, non per tutti i file della directory. In effetti a questo non avevo pensato :oops:
_________________
Della serie: "Informatica for dummies":

Io: "Premi il tasto Invio" - Risp: "Ma il tasto Invio è quello con scritto Enter sopra?"
Io: "Scrivi T maiuscolo" - Risp: "Questa tastiera non ha le lettere maiuscole..."
Back to top
View user's profile Send private message
xoen
Guru
Guru


Joined: 06 Sep 2003
Posts: 472
Location: /dev/null

PostPosted: Wed Jan 12, 2005 6:13 pm    Post subject: Reply with quote

codadilupo wrote:
ottimo, e lo usero' ;-)
Una cosa: magari mettilo in inglese (tanto son quattro righe!): sicuramente verrebbe comodo anche a qualcuno la' fuori ;-)

Accontentati ;)
_________________
xoen.Blog()
god@paradise # tar xfvjp big-bang.tar.bz2 -C universe
Back to top
View user's profile Send private message
Panda
Apprentice
Apprentice


Joined: 31 Jul 2003
Posts: 223
Location: Cremona <=> Catania

PostPosted: Wed Jan 12, 2005 6:56 pm    Post subject: Reply with quote

Simpatico, non ho avuto modo di provarlo perche' non penso di aver niente con tag exif...

cmq ti sconsiglio l'uso di os.popen anche per mkdir e mv. Puoi fare tutto questo col modulo os stesso... anche se funziona IMHO non e' la migliore via per fare operazioni sui file... per il semplice motivo che os.popen legge lo stout del processo, ma non ti ritorna ad esempio nessun codice. Al limite os.system() ti ritornerebbe un return code per capire se l'operazione e' andata a buon fine o meno... ma tanto vale os.mkdir() che casomai ti solleverebbe una eccezione da catturare con try: except.
Back to top
View user's profile Send private message
federico
Advocate
Advocate


Joined: 18 Feb 2003
Posts: 3270
Location: Italy, Milano

PostPosted: Wed Jan 12, 2005 7:09 pm    Post subject: Reply with quote

Puoi lavorare con parametri, file di configurazione oppure interfacce grafiche...

Ricordando che la regola numero uno in verita' e' questa

Code:

import this


dalla console dei comandi python
_________________
Sideralis www.sideralis.org
Pic http://blackman.amicofigo.com/gallery
Arduino http://www.arduino.cc
Chi aveva potuto aveva spaccato
2000 pezzi buttati là
Molti saluti,qualche domanda
Semplice come musica punk
Back to top
View user's profile Send private message
Momentime
Tux's lil' helper
Tux's lil' helper


Joined: 08 Sep 2003
Posts: 111
Location: Italy

PostPosted: Wed Jan 12, 2005 9:17 pm    Post subject: Reply with quote

Ciao.. il tuo programma mi è stato utile! 8)
Ho guardato il codice, e ho visto che SLMUO e' molto complicato nella gestione dei parametri (mitico "import this" =). Riporto il pezzo (i miei commenti sono preceduti da $):

Code:

$ questa funzione e' totalmente inutile! Voglio dire, la usi solo in program_info(), tanto vale
$ scrivere direttamente print ("Exif Organizer - 0.2   2005/01/12") lì
def program_version() :
    print ("Exif Organizer - 0.2   2005/01/12")


def program_info() :
    print ("Exif Organizer - 0.2   2005/01/12")
    print ("Questo script organizza delle foto in directory in base alla data di scatto.")
    print ("Viene utilizzato exiftags, scritto da Eric M. Johnston (che ringrazio!).")
    print ("\nCopyright (C) 2005  Aldo (Xoen) Giambelluca <aldo.giambelluca@email.it>")
    print ("Questo script è distribuito sotto licenza GPL (www.gnu.org)")


def program_usage():
    print ("Uso: exif-organizer [FILE]...");
    print ("   -h, --help\t\tVisualizza questa schermata")
    print ("   -v, --version\tVisualizza la versione")

$ Queste tre funzioni di sopra sono ancora superflue.. potresti direttamente metterle nei due
$ cicli if di sotto..

$ questo if non mi piace.. questo controlla se c'è un "-h" nella prima parte di sys.argv, e non
$ in tutto; se io lo avviassi con "python exif-organizer asd/ -h", non leggerei la guida
if ((len(sys.argv)==1) or (sys.argv[1] in ["--help", "-h"])) :
    program_usage()
    $ metti tutti i print che sono in program_usage() qui     
    sys.exit (0)

$ stesso discorso dell'if di sopra. =)
if (sys.argv[1] in ["--version", "-v"]) :
    program_info()
    $ metti tutti i print che sono in program_info() qui   
    sys.exit (0)


Alla fine io lo scriverei così:
Code:

if ((len(sys.argv) == 1) or ("-h" in sys.argv) or ("--help" in sys.argv)) :
    print ("Uso: exif-organizer [FILE]...");
    print ("   -h, --help\t\tVisualizza questa schermata")
    print ("   -v, --version\tVisualizza la versione")
    sys.exit (0)


if (("--version" in sys.argv) or ("-v" in sys.argv)):
    print ("Exif Organizer - 0.2   2005/01/12")
    print ("Questo script organizza delle foto in directory in base alla data di scatto.")
    print ("Viene utilizzato exiftags, scritto da Eric M. Johnston (che ringrazio!).")
    print ("\nCopyright (C) 2005  Aldo (Xoen) Giambelluca <aldo.giambelluca@email.it>")
    print ("Questo script è distribuito sotto licenza GPL (www.gnu.org)")
    sys.exit (0)

Come puoi vedere sono meno righe..
Chiamare funzioni in questo modo è controproducente, te lo dico per esperienza personale =)
Fare così in programmi molto più complessi può essere un problema serio!
Credo che inoltre l'if così come l'ho corretto sia più corretto.
Ma alla fine sei tu il capo =P

Ah, un altro consiglio: hai presente quanto importi i moduli?
Ho visto che gli oggetti che usi da system sono solo due: exit e argv. E anche da os prendi solo popen, da string prendi find.
Non sarebbe più conveniente fare così?
Code:

from sys import argv, exit
from string import find
from os import popen

Se decidi di seguire questo consiglio, ricorda che se prima usavi sys.exit ora dovrai usare exit.

Spero di essere stato d'aiuto, e poco noioso =P
_________________
Registered Linux User #367816
Registered Linux machine #262819

No hope, life is none, none!
Back to top
View user's profile Send private message
xoen
Guru
Guru


Joined: 06 Sep 2003
Posts: 472
Location: /dev/null

PostPosted: Wed Jan 12, 2005 10:37 pm    Post subject: Reply with quote

mouser wrote:
Solo un'appuntino: magari per la selezione della directory ti conviene gestirla da linea di comando.... non so quanti user si prendono la briga di modificare il codice python :lol:
Per il resto, scriptino interessante.

Ho modificato lo script...ora la directory la puoi scegliere anche da riga di comando così :
Code:

exif-organizer -d directory lista_file

_________________
xoen.Blog()
god@paradise # tar xfvjp big-bang.tar.bz2 -C universe
Back to top
View user's profile Send private message
Panda
Apprentice
Apprentice


Joined: 31 Jul 2003
Posts: 223
Location: Cremona <=> Catania

PostPosted: Wed Jan 12, 2005 10:50 pm    Post subject: Reply with quote

Sono d'accordo sui parametri... un po' meno sul raggruppare o meno in procedure la visualizzazione dell'help e della versione. IMHO trovo piu' comodo e pulito raggrupparle in procedure, piuttosto che riempire il costrutto if. Ma e' ovviamente questione di stile personale. Non vedo invece l'utilita' di tutti quei sys.exit(0). Alla fine credo che sia piu' utile utilizzarlo in casi di errori, ovvero quando si ha la necessita' di far terminare il programma con codici diversi da 0. Nella fattispecie eviterebbe solamente che fossero eseguite le porzioni di codice al verificarsi del True contemporaneamente per -v e -h... ma non credo che sia la fine del mondo... :P
Back to top
View user's profile Send private message
Display posts from previous:   
Reply to topic    Gentoo Forums Forum Index Forum italiano (Italian) Risorse italiane (documentazione e tools) All times are GMT
Goto page 1, 2  Next
Page 1 of 2

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum