View previous topic :: View next topic |
Author |
Message |
xoen Guru
Joined: 06 Sep 2003 Posts: 472 Location: /dev/null
|
Posted: Wed Jan 12, 2005 12:08 am Post subject: [SCRIPT PYTHON] Exif Organizer |
|
|
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
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 :
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 |
|
|
xchris Advocate
Joined: 10 Jul 2003 Posts: 2824
|
Posted: Wed Jan 12, 2005 8:22 am Post subject: |
|
|
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
http://localhost:1080
ciao _________________ while True:Gentoo() |
|
Back to top |
|
|
xoen Guru
Joined: 06 Sep 2003 Posts: 472 Location: /dev/null
|
Posted: Wed Jan 12, 2005 1:18 pm Post subject: |
|
|
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 |
|
|
mouser Veteran
Joined: 10 Aug 2004 Posts: 1419 Location: Milano
|
Posted: Wed Jan 12, 2005 4:23 pm Post subject: |
|
|
Dovro' mettermi anch'io a lavorare un po' con python, visto che cerco di smanettare un po' in bash, ma con scarsi risultati
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
Per il resto, scriptino interessante.
Ciriciao
mouser |
|
Back to top |
|
|
xoen Guru
Joined: 06 Sep 2003 Posts: 472 Location: /dev/null
|
Posted: Wed Jan 12, 2005 4:30 pm Post subject: |
|
|
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 |
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 |
|
|
codadilupo Advocate
Joined: 05 Aug 2003 Posts: 3135
|
Posted: Wed Jan 12, 2005 4:39 pm Post subject: |
|
|
ottimo, e lo usero'
Una cosa: magari mettilo in inglese (tanto son quattro righe!): sicuramente verrebbe comodo anche a qualcuno la' fuori
Coda |
|
Back to top |
|
|
xoen Guru
Joined: 06 Sep 2003 Posts: 472 Location: /dev/null
|
Posted: Wed Jan 12, 2005 4:46 pm Post subject: |
|
|
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 |
|
|
mouser Veteran
Joined: 10 Aug 2004 Posts: 1419 Location: Milano
|
Posted: Wed Jan 12, 2005 4:48 pm Post subject: |
|
|
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
My 2 eurocent
Ciriciao
mouser |
|
Back to top |
|
|
codadilupo Advocate
Joined: 05 Aug 2003 Posts: 3135
|
Posted: Wed Jan 12, 2005 4:55 pm Post subject: |
|
|
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 |
|
Back to top |
|
|
mouser Veteran
Joined: 10 Aug 2004 Posts: 1419 Location: Milano
|
Posted: Wed Jan 12, 2005 5:04 pm Post subject: |
|
|
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 ) 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
mouser |
|
Back to top |
|
|
xoen Guru
Joined: 06 Sep 2003 Posts: 472 Location: /dev/null
|
Posted: Wed Jan 12, 2005 5:16 pm Post subject: |
|
|
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
|
Si avevo dimenticato di scrivere che serviva un ...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 |
|
|
mouser Veteran
Joined: 10 Aug 2004 Posts: 1419 Location: Milano
|
Posted: Wed Jan 12, 2005 5:18 pm Post subject: |
|
|
Mah, non saprei, comunque altervista fa quasi sempre cosi', credo sia un problema suo |
|
Back to top |
|
|
xoen Guru
Joined: 06 Sep 2003 Posts: 472 Location: /dev/null
|
Posted: Wed Jan 12, 2005 5:26 pm Post subject: |
|
|
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 ) 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 |
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 |
|
|
codadilupo Advocate
Joined: 05 Aug 2003 Posts: 3135
|
Posted: Wed Jan 12, 2005 5:32 pm Post subject: |
|
|
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 |
|
Back to top |
|
|
mouser Veteran
Joined: 10 Aug 2004 Posts: 1419 Location: Milano
|
Posted: Wed Jan 12, 2005 5:35 pm Post subject: |
|
|
codadilupo wrote: |
allora comincia il programma.. ehmm.. il lavoro per farti il certificato
|
deformazione gentooistica ???
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 |
|
Back to top |
|
|
xoen Guru
Joined: 06 Sep 2003 Posts: 472 Location: /dev/null
|
Posted: Wed Jan 12, 2005 5:42 pm Post subject: |
|
|
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? _________________ xoen.Blog()
god@paradise # tar xfvjp big-bang.tar.bz2 -C universe |
|
Back to top |
|
|
xchris Advocate
Joined: 10 Jul 2003 Posts: 2824
|
Posted: Wed Jan 12, 2005 5:47 pm Post subject: |
|
|
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 |
|
|
xoen Guru
Joined: 06 Sep 2003 Posts: 472 Location: /dev/null
|
Posted: Wed Jan 12, 2005 5:49 pm Post subject: |
|
|
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 :
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. _________________ xoen.Blog()
god@paradise # tar xfvjp big-bang.tar.bz2 -C universe |
|
Back to top |
|
|
mouser Veteran
Joined: 10 Aug 2004 Posts: 1419 Location: Milano
|
Posted: Wed Jan 12, 2005 5:50 pm Post subject: |
|
|
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
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 |
|
Back to top |
|
|
xoen Guru
Joined: 06 Sep 2003 Posts: 472 Location: /dev/null
|
Posted: Wed Jan 12, 2005 6:13 pm Post subject: |
|
|
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 |
|
|
Panda Apprentice
Joined: 31 Jul 2003 Posts: 223 Location: Cremona <=> Catania
|
Posted: Wed Jan 12, 2005 6:56 pm Post subject: |
|
|
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 |
|
|
federico Advocate
Joined: 18 Feb 2003 Posts: 3272 Location: Italy, Milano
|
Posted: Wed Jan 12, 2005 7:09 pm Post subject: |
|
|
Puoi lavorare con parametri, file di configurazione oppure interfacce grafiche...
Ricordando che la regola numero uno in verita' e' questa
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 |
|
|
Momentime Tux's lil' helper
Joined: 08 Sep 2003 Posts: 111 Location: Italy
|
Posted: Wed Jan 12, 2005 9:17 pm Post subject: |
|
|
Ciao.. il tuo programma mi è stato utile!
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 |
|
|
xoen Guru
Joined: 06 Sep 2003 Posts: 472 Location: /dev/null
|
Posted: Wed Jan 12, 2005 10:37 pm Post subject: |
|
|
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
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 |
|
|
Panda Apprentice
Joined: 31 Jul 2003 Posts: 223 Location: Cremona <=> Catania
|
Posted: Wed Jan 12, 2005 10:50 pm Post subject: |
|
|
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... |
|
Back to top |
|
|
|
|
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
|
|