# [SCRIPT PYTHON] Exif Organizer

## xoen

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

```

$ file nome_file

```

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

```

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 :

```

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 :

```
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 :

```

# 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 :

```

$ exif-organizer.py *

```

o se preferite :

```

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

```

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

```

$ exif-organizer.py -c *

```

Vi ritroverete le foto suddivise per data.

Se volete potete vedere l'help

```

$ 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 :

```

#! /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.

----------

## xchris

posso ben comprendere il tuo entusiasmo per python.

Ha avuto lo stesso effetto con me  :Smile: 

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

```

pydoc -p 1080

```

http://localhost:1080

ciao  :Wink: 

----------

## xoen

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à?

----------

## mouser

Dovro' mettermi anch'io a lavorare un po' con python, visto che cerco di smanettare un po' in bash, ma con scarsi risultati  :Crying or Very sad: 

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  :Laughing: 

Per il resto, scriptino interessante.

Ciriciao

mouser  :Wink: 

----------

## xoen

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

----------

## codadilupo

ottimo, e lo usero'  :Wink: 

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

Coda

----------

## xoen

 *codadilupo wrote:*   

> ottimo, e lo usero' 

 

Davvero? Ottimo! Se può essere utile a 2 persone non è stato lavoro inutile  :Wink:  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.

----------

## mouser

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

My 2 eurocent

Ciriciao

mouser  :Wink: 

----------

## codadilupo

qualcosa tipo questo, per intenderci  :Wink: 

```
#! /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à  :Wink: 

P.P.S.: sicuramente l'indentazione é andata a farsi benedire  :Wink: 

Coda

----------

## mouser

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

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

```

# time; exif-organizer [FILE];time

```

ti visualizza un cambiamento, ma l'etica (e chiedo scusa a coda se rubo uno dei 3 termini tabu  :Laughing:  ) 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:

```

E' presente C? ----> Esci

E' presente B? ----> Continua

\-----------> E' mancante A? ----> Esci

Continua il programma

```

Spero di essere stato chiaro   :Laughing: 

mouser  :Wink: 

----------

## xoen

 *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 

```
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?)

----------

## mouser

Mah, non saprei, comunque altervista fa quasi sempre cosi', credo sia un problema suo  :Laughing: 

----------

## xoen

 *codadilupo wrote:*   

> qualcosa tipo questo, per intenderci 
> 
> ```
> #! /usr/bin/env python
> 
> ...

 

Grazie per la traduzione  :Smile: 

 *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
> 
> ```
> 
> # time; exif-organizer [FILE];time
> ...

 

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

----------

## codadilupo

 *xoen wrote:*   

> Grazie per la traduzione 

 

figurati  :Wink: 

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

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

Coda

----------

## mouser

 *codadilupo wrote:*   

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

 

deformazione gentooistica ???  :Laughing: 

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: 

----------

## xoen

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

Questo if : 

```

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: 

----------

## xchris

un link che puo' tornare comodo:

http://home.cfl.rr.com/genecash/digital_camera.html

cosi' puoi anche catalogare le immagini secondo altri criteri  :Wink: 

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

ciao e happy python  :Smile: 

----------

## xoen

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

```

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.   :Rolling Eyes: 

----------

## mouser

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   :Embarassed: 

----------

## xoen

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

----------

## Panda

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.

----------

## federico

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

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

```

import this

```

dalla console dei comandi python

----------

## Momentime

Ciao.. il tuo programma mi è stato utile!  :Cool: 

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 $):

```

$ 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ì:

```

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ì? 

```

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

----------

## xoen

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

```

exif-organizer -d directory lista_file

```

----------

## Panda

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

----------

## xoen

 *Panda wrote:*   

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

 

Ho usato os.mkdir(), inoltre ho scoperto qualche funzioncina simpatica in os.path  :Wink: 

 *Panda wrote:*   

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

 

Forse ho esagerato con le procedure, ma la mia intenzione era di tenere lo script pulito.

----------

## xoen

EXIF ORGANIZER - 0.45

*) Utilizza optparse.OptionParser per le opzioni da riga di comando.

*) Aggiunta l'opzione -c (--copy), che copia (piuttosto che spostare) le foto nelle varie sotto directory

*) Utilizza shutil.move piuttosto che richiamare il comando mv (rende lo script più portabile)

La variabile copy_move è un puntatore a funzione (Ma è geniale questo linguaggio!), a copy o a move a seconda che l'utente abbia passato l'opzione -c (--copy) o meno.

Ho fatto così, per evitare di ripetere il controllo all'interno del for, tanto si copieranno o si sposteranno tutti i file.

----------

## mouser

OK, ho capito, devo mettermi a maneggiare con python!

Essendo un grandissimo stimatore (nonche', per tirarmela un po', conoscitore  :Laughing:  ) di C, sentire parlare di puntatori a funzione tende a farmi sbavare un pochettino.... speriamo di non rovinare la tastiera  :Laughing: 

Comunque complimenti per lo script

Ciriciao

mouser  :Wink: 

----------

## Momentime

Prova a dare un'occhiata a shutil.copyfile -- è il corrispondente di shutil.move, solo che copia. Funziona più o meno allo stesso modo =)

[OT]

Tra un po' posto anche il mio programma per rinominare file tipo "asd qwe" in "asd_qwe" =)

[/OT]

----------

## Panda

 *mouser wrote:*   

> OK, ho capito, devo mettermi a maneggiare con python!

  Con tutto il rispetto.... ci hai perso tempo!  :Razz: 

----------

## xoen

EXIF ORGANIZER - 0.5

*) Utilizza shutil.copy piuttosto che richiamare il comando cp (rende lo script più portabile)

*) Create le funzioni hasEXIF e getShotDate per rendere  script più umanamente leggibile

*) Qualche eccezione *gestita* (nello spostamento/copia del file e nella creazione della directory).

*) Completamente in *inglese* (anche i nomi delle variabili/funzioni)

PS: Ma a voi *bippa*? (la stringa "\a", a me no, boh...dovrebbe, penso).

----------

## codadilupo

 *xoen wrote:*   

> PS: Ma a voi *bippa*? (la stringa "\a", a me no, boh...dovrebbe, penso).

 

si', bippa  :Wink: 

Coda

----------

## federico

 *Panda wrote:*   

>  *mouser wrote:*   OK, ho capito, devo mettermi a maneggiare con python!  Con tutto il rispetto.... ci hai perso tempo! 

 

Che significa?

EDIT:

Invito il programmatore del progetto a non chiamare il proprio lavoro script, infatti la comunita' python si sente sminuita, i lavori sono programmi, python e' un linguaggio di programmazione e non di scripting  :Smile:  Quandi hai portabilita' multipiattaforma, interfacce verso almeno 4 librerie grafiche, e tutto quello che hanno anche gli altri linguaggio di programmazione riconosciuti  :Smile:  non possiamo chiamarlo linguaggio di scripting  :Smile:  [I programmi possono essere compilati volendo]

----------

## xoen

 *federico wrote:*   

>  *Panda wrote:*    *mouser wrote:*   OK, ho capito, devo mettermi a maneggiare con python!  Con tutto il rispetto.... ci hai perso tempo!  
> 
> Che significa?

 

Presumo voglia significare "E l'hai capito solo ora??", poi non saprei.

 *federico wrote:*   

> 
> 
> EDIT:
> 
> Invito il programmatore del progetto a non chiamare il proprio lavoro script, infatti la comunita' python si sente sminuita, i lavori sono programmi, python e' un linguaggio di programmazione e non di scripting  Quandi hai portabilita' multipiattaforma, interfacce verso almeno 4 librerie grafiche, e tutto quello che hanno anche gli altri linguaggio di programmazione riconosciuti  non possiamo chiamarlo linguaggio di scripting  [I programmi possono essere compilati volendo]

 

In effetti trovo python un gran bel linguaggio...

...Non era per offendere nessuno  :Smile: ...sai com'è, essendo interpretato.

(c'avevo pensato prima) Qualche info sulla compilazione? Compila in binario, o in una specie di bytecode alla java?

----------

## federico

 *xoen wrote:*   

> Qualche info sulla compilazione? Compila in binario, o in una specie di bytecode alla java?

 

Il vero pythonista di famiglia e' mio fratello come torna gli domando qualche informazione aggiuntiva + dettagliata, so che si puo' fare e l'ho visto fare ma non so bene come ^_^

----------

## xoen

 *federico wrote:*   

> EDIT:
> 
> Invito il programmatore del progetto a non chiamare il proprio lavoro script, infatti la comunita' python si sente sminuita, i lavori sono programmi, python e' un linguaggio di programmazione e non di scripting 

 

Aprire gEdit, menù Visualizza --> Modalità di evidenziazione --> Script ... LOL (O no?  :Embarassed:  )

----------

## federico

 *xoen wrote:*   

>  *federico wrote:*   EDIT:
> 
> Invito il programmatore del progetto a non chiamare il proprio lavoro script, infatti la comunita' python si sente sminuita, i lavori sono programmi, python e' un linguaggio di programmazione e non di scripting  
> 
> Aprire gEdit, menù Visualizza --> Modalità di evidenziazione --> Script ... LOL (O no?  )

 

Penso che alla comunita' python non gli freghi di quello che pensa gedit  :Smile:  (Maledetto gedit ora scrivo ai produttori per lamentarmi  :Smile:   :Smile:   :Smile:  )Per altro non ho mai visto com'e' fatto gedit, in grafica solitamente uso scite 

```

*  app-editors/scite

      Latest version available: 1.6.2

      Latest version installed: 1.6.2

      Size of downloaded files: 1,113 kB

      Homepage:    http://www.scintilla.org

      Description: A very powerful editor for programmers

      License:     PYTHON

```

Facevo notare questa cosa perche' il vero pythonista ci tiene ^^ Da qualche parte si puo' trovare quello che dice il fondatore di python, guido van rossum (il quale ha l'ultimo e insindacabile giudizio sullo sviluppo di python) , se lo trovo lo posto !

Vado a nanna anche io ^^

----------

## xchris

io posso solo dire che con la bash non sarei mai riuscito a fare unclepine....

non tanto perche' non e' possibile...ma perche' il mio livello non me lo permetteva.

Con python al 3 o 4 tool in python e' stato gia' possibile farlo.. (ho imparato le basi in pochissimo tempo)

ciao

----------

## xoen

Qualcuno sa come mai lo script non funziona con i file con nomi strani (che contengono spazi)?

Dice che il file non contiene informazioni EXIF!

Qualche modo per rinominare i file in modo da sostituire gli spazi con "_"? o meglio tutti i caratteri *strani* con "_"? C'è già qualche script? O devo scriverne uno da zero (A prima vista non sembrerebbe impossibile).

----------

## mouser

Per un tool che faccia il lavoro di sostituzione mi sa che puoi sentire Momentime... qualche post fa mi sembra di aver capito che sta lavorando proprio in quel senso...

----------

## xoen

 *mouser wrote:*   

> Per un tool che faccia il lavoro di sostituzione mi sa che puoi sentire Momentime... qualche post fa mi sembra di aver capito che sta lavorando proprio in quel senso...

 

Si infatti mi sembrava d'aver letto che stava scrivendo uno script che se ho capito bene rinomina i file con nomi strani.

Se modifico il comando richiamato dallo script aggiungendo le virgolette risolvo qualcosa :

```

    file_result = os.popen ("file \""+filename+"\"").readline()

```

Va meglio, ma ho ancora qualche problema...vedremo...

----------

## randomaze

Moved from Forum italiano (Italian) to Risorse italiane (documentazione e tools).

L'ho trovato per caso e mi sembrava nel posto sbagliato   :Cool: 

----------

