[Python] Programma per rinominare file

#1
Ciao a tutti,

Lavorando al pc mi ritrovo talvolta a dover rinominare in massa una serie di file, tutte nello stesso modo.
Mi spiego meglio con un esempio.
Ho una directory con all'interno una serie di file che si chiamano: "Prova 1" "Prova 2" "Prova 3" ecc... per questione di organizzazione e comodità mi ritrovo a rinominare ogni file togliendo la parola "Prova" e lasciando solo il numero di riferimento come nome, quindi mi ritroverò con file chiamati "1", "2", "3"...
Avendo conoscenze poco più sopra la base di Python (e continuando a studiarlo per imparare nuove cose) mi sono messo in testa di voler crearmi un piccolo programmino che rimuova al mio posto la parola "Prova" (o qualunque essa sia, in quanto sarò io stesso a dire al programma quale parola rimuovere dal nome di tutti i file).

Da un punto di vista strutturale ho in mente più o meno come impostare il codice, solo che ovviamente mi mancano alcune nozioni e conoscenze per poter fare quello che voglio.

Il primo quesito che mi sono posto è: Come faccio a muovermi all'interno del file system in Python? Inizialmente vorrei che il programma partisse già all'interno della cartella contente i file, successivamente vorrei implementare l'opzione di dare all'utente la possibilità di scegliere lui stesso la posizione di dove si trovano i file da rinominare.

Grazie a chi mi aiuterà in questo piccolo progetto


PS. Non so se già esistono programmi che facciano ciò che ho intenzione di creare, ma non mi interessa. Mi sono posto l'obiettivo di crearmelo da solo, sia per soddisfazione personale e sia per voler apprendere sempre più cose nuove di questo linguaggio di programmazione.
 

Andretti60

Utente Attivo
3,130
2,034
Hardware Utente
#2
Il linguaggio Python fu creato proprio per quello: creare script per manipolare il sistema operativo, indipendentemente dal sistema operativo stesso (ossia sostituendo le varie shell). Il comando che cerchi è os.listdir, non è il solo ma il più immediato. La libreria os, ti linko la pagina ufficiale, è quella che fa per te
https://docs.python.org/3/library/os.html
Come da regolamento, ti lascio il tempo per postare i tuoi tentativi, poi ne riparliamo. Concentrati prima di tutto sulla “base”, ossia come cambiare il nome di documenti in una cartella, dettagli in seguito (per esempio specificare la cartella).
 
Mi Piace: Davo23
#3
Il linguaggio Python fu creato proprio per quello: creare script per manipolare il sistema operativo, indipendentemente dal sistema operativo stesso (ossia sostituendo le varie shell). Il comando che cerchi è os.listdir, non è il solo ma il più immediato. La libreria os, ti linko la pagina ufficiale, è quella che fa per te
https://docs.python.org/3/library/os.html
Come da regolamento, ti lascio il tempo per postare i tuoi tentativi, poi ne riparliamo. Concentrati prima di tutto sulla “base”, ossia come cambiare il nome di documenti in una cartella, dettagli in seguito (per esempio specificare la cartella).
Grazie mille per la disponibilità e documentazione fornita!

Sono arrivato a questa prima conclusione, funziona ma esteticamente è bruttina e sicuramente suppongo si possa ottimizzare meglio, soprattutto incrementanto qualche alert, però questo lo lascio giudicare a voi (ogni critica costruttiva è ben accetta, voglio migliorare molto anche l'ortografia).

Codice:
Python:
import os

x = input("Inserire parola da rimuovere: ")
lis = os.listdir(".")

for item in lis:

    if x in item:

        new = item.replace(x,"")

        os.rename(item,new)
pre.png
post.jpg
 

Andretti60

Utente Attivo
3,130
2,034
Hardware Utente
#4
Funziona, non ha importante che il codice sia "brutto" o "bello", sono sempre opinioni personali. Io per esempio non uso nomi di variabili tipo 'x' che sono sibilline (x ha poi ben altri significati), mi piace dare nomi piu' lunghi e piu' descrittivi. Ripeto, parere personale. Si inizia con un codice di poche linee e quindi e' accettabile chiamare una variabile 'a' (per esempio), appena il programma cresce ci si dimentica subito cosa sia 'a'.

L'unica cosa da stare attento: devi essere sicuro che in quella cartella non ci siano documenti contenenti quella stessa parola, che invece NON vuoi eliminare, ossia fare un minimo di accertamento che il nome del file corrisponda a quello che vuoi effettivamente modificare. Ma se non hai questo problema, allora va bene.

Un miglioramento sicuro e' il controllo di errore, ci sono molti motivi per cui un file non puo' essere rinominato (per esempio e' in uso), quindi devi aggiungere un controllo di errore (ossia un costrutto try: except)
https://docs.python.org/3/tutorial/errors.html
 
Mi Piace: Davo23
#5
Funziona, non ha importante che il codice sia "brutto" o "bello", sono sempre opinioni personali. Io per esempio non uso nomi di variabili tipo 'x' che sono sibilline (x ha poi ben altri significati), mi piace dare nomi piu' lunghi e piu' descrittivi. Ripeto, parere personale. Si inizia con un codice di poche linee e quindi e' accettabile chiamare una variabile 'a' (per esempio), appena il programma cresce ci si dimentica subito cosa sia 'a'.
Ti ringrazio molto!
Concordo sul fatto dei nomi delle variabili, mi trovo spesso "in difficoltà" su questo punto quando programmo perchè non so mai che nome dar loro e finisco con chiamare "x" la mia variabile chiave su cui si basa il programma.
L'unica cosa da stare attento: devi essere sicuro che in quella cartella non ci siano documenti contenenti quella stessa parola, che invece NON vuoi eliminare, ossia fare un minimo di accertamento che il nome del file corrisponda a quello che vuoi effettivamente modificare. Ma se non hai questo problema, allora va bene.
Non dovrei aver problemi di questo tipo, però potrei provare a lavorarci su pur di rendere il programma il più completo possibile!
Un miglioramento sicuro e' il controllo di errore, ci sono molti motivi per cui un file non puo' essere rinominato (per esempio e' in uso), quindi devi aggiungere un controllo di errore (ossia un costrutto try: except)
https://docs.python.org/3/tutorial/errors.html
Ottimo suggerimento, grazie della documentazione, mi informo subito e vedo come fare!

EDIT: Ho fatto vari test, il programma funziona anche con i file aperti e non mi spiego questa cosa. Inoltre ho provato a seguire il try/except del doc ma non saprei bene come usarla, in quanto io sto lavorando sulle stringhe del nome del file e non sul file stesso, quindi non so come verificare se il file risulta aperto. Se non mi sono spiegato dimmelo che provo con un esempio :hihi:

Prossimo obiettivo: mi piacerebbe avesse un'interfaccia grafica tutta sua e che non sia il solito programma eseguibile solo da terminale. Non ho mai lavorato su un'interfaccia grafica di un programma, per cui sono completamente all'oscuro di tutto. Come dovrei muovermi per fare ciò?
 
Ultima modifica:

Andretti60

Utente Attivo
3,130
2,034
Hardware Utente
#8
Ti ringrazio molto!
Concordo sul fatto dei nomi delle variabili, mi trovo spesso "in difficoltà" su questo punto quando programmo perchè non so mai che nome dar loro e finisco con chiamare "x" la mia variabile chiave su cui si basa il programma.
Scrissi una miniguida a proposito:
https://forum.tomshw.it/threads/come-dare-un-nome-alle-variabili.683112/

EDIT: Ho fatto vari test, il programma funziona anche con i file aperti e non mi spiego questa cosa. Inoltre ho provato a seguire il try/except del doc ma non saprei bene come usarla, in quanto io sto lavorando sulle stringhe del nome del file e non sul file stesso, quindi non so come verificare se il file risulta aperto. Se non mi sono spiegato dimmelo che provo con un esempio :hihi:
Dipende da che applicazione stia usando il file, alcune notificano il sistema operativo che il file sia in uso, altre no, in quel caso il documento rimane bloccato o addirittura read-only (per esempio MSWord) e quindi il sistema operativo proibisce eventali operazioni su essi. Ma era solo un esempio, quando si lavora sul file system di un systema operativo si deve sempre tenere conto che errori possono capitare, anche (e soprattutto) inaspettati.
Se non usi il try/except il programma va in protezione (crash/boom), la cosa piu' semplice da fare e' di mettere un messaggio di errore nel costrutto 'except' avvisando dell'errore avvenuto, e proseguire. Si puo' fare ovviamente un sacco di altre cose, a seconda del tipo di errore che si riceve, ma qui il discorso diventa piu' ampio.

Prossimo obiettivo: mi piacerebbe avesse un'interfaccia grafica tutta sua e che non sia il solito programma eseguibile solo da terminale. Non ho mai lavorato su un'interfaccia grafica di un programma, per cui sono completamente all'oscuro di tutto. Come dovrei muovermi per fare ciò?
Python non e' pensato per avere una interfaccia grafica, fu creato essenzialmente per eseguire scripts, ossia piccoli programmi di sistema che vengono chiamati da altri programmi per automatizzare noiosi lavori iterativi (come quello che stai scrivendo tu in questo momento).
Ma ai programmatori piace cosi tanto come linguaggio che lo stanno usando un po' per tutto (purtroppo, dico io). Adesso e' essenzialmente un linguaggio "collante" (glue, in inglese), ossia viene usato per scrivere script che richiamano librerie molto piu' complicate (scritte generalmente in C). E' per esempio uno dei preferiti nel settore "machine learning" perche' permette facilmente di usare librerie scritte appositamente per lo scopo.
Io in genere consiglio di lasciare stare interfacce grafiche, ci sono altri linguaggi fatti appositamente per quello scopo.
Ma per chi vuole (e certamente va bene por imparare), ci sono alcuni pacchetti grafici, in questo caso io consiglio sempre quelli piu' semplici, per lo stesso motivo, quindi per esempio TKinter (come suggerito da @BAT00cent), che e' leggero e funzionale, non permette grandi cose ma l'essenziale. Ha i controlli di base (bottoni, etichette, blocchi di testo e spunta e cosi' via) e permette facilmente di allinearli in righe colonne in maniera automatica. Non il massimo dell'eleganza, ma funzionale.
Comunque credimi, si possono scrivere eccellenti applicativi in Python senza nessuna interfaccia grafica. Nel tuo caso, basta passare due stringhe, la cartella da usare e la stringa da eliminare nel nome dei documenti in tale cartella.
 
Mi Piace: Davo23 e BAT00cent
#10
Molto utile e interessante, appena ho un attimo di tempo ci do una lettura, grazie!
Dipende da che applicazione stia usando il file, alcune notificano il sistema operativo che il file sia in uso, altre no, in quel caso il documento rimane bloccato o addirittura read-only (per esempio MSWord) e quindi il sistema operativo proibisce eventali operazioni su essi. Ma era solo un esempio, quando si lavora sul file system di un systema operativo si deve sempre tenere conto che errori possono capitare, anche (e soprattutto) inaspettati.
Se non usi il try/except il programma va in protezione (crash/boom), la cosa piu' semplice da fare e' di mettere un messaggio di errore nel costrutto 'except' avvisando dell'errore avvenuto, e proseguire. Si puo' fare ovviamente un sacco di altre cose, a seconda del tipo di errore che si riceve, ma qui il discorso diventa piu' ampio.
Il problema è che non ho proprio capito il funzionamento della try:except e quindi non saprei proprio che righe di codice scrivere:cry:
Python non e' pensato per avere una interfaccia grafica, fu creato essenzialmente per eseguire scripts, ossia piccoli programmi di sistema che vengono chiamati da altri programmi per automatizzare noiosi lavori iterativi (come quello che stai scrivendo tu in questo momento).
Ma ai programmatori piace cosi tanto come linguaggio che lo stanno usando un po' per tutto (purtroppo, dico io). Adesso e' essenzialmente un linguaggio "collante" (glue, in inglese), ossia viene usato per scrivere script che richiamano librerie molto piu' complicate (scritte generalmente in C). E' per esempio uno dei preferiti nel settore "machine learning" perche' permette facilmente di usare librerie scritte appositamente per lo scopo.
Io in genere consiglio di lasciare stare interfacce grafiche, ci sono altri linguaggi fatti appositamente per quello scopo.
Ma per chi vuole (e certamente va bene por imparare), ci sono alcuni pacchetti grafici, in questo caso io consiglio sempre quelli piu' semplici, per lo stesso motivo, quindi per esempio TKinter (come suggerito da @BAT00cent), che e' leggero e funzionale, non permette grandi cose ma l'essenziale. Ha i controlli di base (bottoni, etichette, blocchi di testo e spunta e cosi' via) e permette facilmente di allinearli in righe colonne in maniera automatica. Non il massimo dell'eleganza, ma funzionale.
Comunque credimi, si possono scrivere eccellenti applicativi in Python senza nessuna interfaccia grafica. Nel tuo caso, basta passare due stringhe, la cartella da usare e la stringa da eliminare nel nome dei documenti in tale cartella.
Concordo con @Andretti60 su TKinter, è quello più semplice da padroneggiare (e poi è già incluso);
Le altre che citavo sono 2 tra le più note librerie grafiche, ma all'inizio è meglio non mettere troppa carne al fuoco, vai di TKinter
Vi ringrazio per i suggerimenti in merito! C'è mica qualche guida in merito? Non saprei proprio da dove cominciare né tanto meno come iniziare ad usarlo.. So che creare un' interfaccia per questo piccolo programmino è inutile, però lo utilizzo apposta come scusa per imparare qualcosa sulle interfacce grafiche :asd:
 

clessidra

Utente Attivo
275
48
Hardware Utente
CPU
VIA C3
Scheda Video
Ati Rage
Sistema Operativo
linux - Red Hat 1.1
#11
Con PyGTK normalmente si intende Python 2 con le GTK2, mentre Python 3 può usare solo le GTK3. E non c'è sempre una diretta corrispondenza.
PyQt (con le QT5) sembra essere una soluzione omnicomprensiva ma è anche molto dispersiva.
In entrambi i casi bisognerà aggiungere queste librerie a parte e la portabilità va a farsi benedire poichè tutti gli utilizzatori del programma dovranno a loro volta installarle.
Tkinter è integrato in Python, ciò significa nulla da aggiungere, e per le cose più semplici va anche bene. Forse è anche più semplice da imparare.
Post unito automaticamente:

try/except è abbastanza semplice. Per esempio:
Codice:
try:
    os.rename(item, new)
except:
    pass
Con questo codice python cerca di rinominare il file e se per qualsiasi motivo non ci riesce non fa nulla (questo è il significato di pass).
Codice:
try:
    os.rename(item, new)
except:
    print("errore")
Con questo codice in caso di un errore qualsiasi stampa la scritta errore.

Quale guida? In rete c'è tanto. Per me potresti iniziare da qui:
https://www.html.it/pag/71781/tkinter/
e da qui:
https://docs.python.org/3.7/library/tkinter.html
 
Ultima modifica:
#12
try/except è abbastanza semplice. Per esempio:
Codice:
try:
    os.rename(item, new)
except:
    pass
Con questo codice python cerca di rinominare il file e se per qualsiasi motivo non ci riesce non fa nulla (questo è il significato di pass).
Codice:
try:
    os.rename(item, new)
except:
    print("errore")
Con questo codice in caso di un errore qualsiasi stampa la scritta errore.
Ti ringrazio! Questo il codice aggiornato, testato e funziona! :ok:

Python:
import os

x = input("Inserire parola da rimuovere: ")
lis = os.listdir(".")

for item in lis:

    if x in item:

        new = item.replace(x,"")

        try:
            os.rename(item, new)
        except:
            print("Errore: impossibile rinominare il file {}".format(item))
Con PyGTK normalmente si intende Python 2 con le GTK2, mentre Python 3 può usare solo le GTK3. E non c'è sempre una diretta corrispondenza.
PyQt (con le QT5) sembra essere una soluzione omnicomprensiva ma è anche molto dispersiva.
In entrambi i casi bisognerà aggiungere queste librerie a parte e la portabilità va a farsi benedire poichè tutti gli utilizzatori del programma dovranno a loro volta installarle.
Tkinter è integrato in Python, ciò significa nulla da aggiungere, e per le cose più semplici va anche bene. Forse è anche più semplice da imparare.
Post unito automaticamente:


Quale guida? In rete c'è tanto. Per me potresti iniziare da qui:
https://www.html.it/pag/71781/tkinter/
e da qui:
https://docs.python.org/3.7/library/tkinter.html
Perfetto, comincerò pian piano a studiarmi Tkinter seguendo le guide che mi hai postato! :love:

Grazie a tutti ragazzi :luxhello:
 
#14
Solo un'ultima osservazione:
quando rinomini da "Prova 1" a "1" oltre alla parola Prova c'è anche uno spazio.
Non so come mai ma non inserendo un'istruzione anche per lo spazio il codice funziona anche per quello. Infatti eseguendo il programma "Prova 1" diventa "1" e non " 1". Sapresti dirmi come mai? Forse perchè il SO non consente file che siano rinominati con uno spazio iniziale e lo rimuove in autonomia. Ma non so, sono supposizioni le mie :asd:
 

clessidra

Utente Attivo
275
48
Hardware Utente
CPU
VIA C3
Scheda Video
Ati Rage
Sistema Operativo
linux - Red Hat 1.1
#15
Non so come mai ma non inserendo un'istruzione anche per lo spazio il codice funziona anche per quello. Infatti eseguendo il programma "Prova 1" diventa "1" e non " 1". Sapresti dirmi come mai? Forse perchè il SO non consente file che siano rinominati con uno spazio iniziale e lo rimuove in autonomia. Ma non so, sono supposizioni le mie :asd:
Credo che dipenda da Windows che in maniera autonoma elimina lo spazio iniziale. Ma un programmatore non dovrebbe lasciare le cose al caso :)
 
Mi Piace: Davo23

Discussioni Simili


Entra