Rinominare a mano trenta scansioni chiamate IMG_0041.jpg, IMG_0042.jpg e così via è noioso ma fattibile. Rinominarne trecento, magari ogni mese, è il tipo di lavoro che conviene affidare a uno script. Python, con il modulo standard pathlib, permette di farlo in poche righe e, soprattutto, in modo controllato: prima si guarda cosa succederà, poi si esegue.
Perché uno script e non lo strumento del sistema operativo
Esplora file di Windows e il Finder di macOS hanno funzioni di rinomina multipla, ma sono limitate: aggiungono un numero progressivo o sostituiscono un pezzo di testo. Appena la regola diventa più ricca («metti davanti la data di modifica, poi il nome del cliente letto dalla cartella, poi un numero a tre cifre») servono strumenti più flessibili. Uno script ha anche un altro vantaggio: è ripetibile. La regola scritta oggi funzionerà allo stesso modo tra sei mesi.
Lo schema di base con pathlib
Il cuore di ogni rinomina è sempre lo stesso: elencare i file, calcolare il nuovo nome, applicarlo.
from pathlib import Path
cartella = Path("C:/Lavoro/Scansioni")
for i, file in enumerate(sorted(cartella.glob("*.jpg")), start=1):
nuovo = file.with_name(f"fattura_{i:03d}{file.suffix.lower()}")
print(file.name, "->", nuovo.name)
Alcuni dettagli che fanno la differenza:
sorted()garantisce un ordine prevedibile; senza, l'ordine dipende dal filesystem.{i:03d}produce001,002,010: con gli zeri iniziali i file restano ordinati correttamente anche in ordine alfabetico.file.suffix.lower()uniforma le estensioni, evitando di avere.JPGe.jpgmescolati.
Notate che lo script, per ora, si limita a stampare. È voluto.
La prova a vuoto prima di tutto
Il primo principio di qualunque automazione sui file è separare il calcolo dall'azione. Una variabile PROVA = True all'inizio dello script permette di vedere l'elenco completo delle trasformazioni senza toccare nulla. Solo quando l'elenco convince si passa a False.
PROVA = True
if PROVA:
print(file.name, "->", nuovo.name)
else:
file.rename(nuovo)
Nel mio lavoro questa abitudine ha evitato più guai di qualunque altra tecnica: un errore nella regola di rinomina si vede subito nella lista, mentre scoprirlo dopo significa ricostruire a mano i nomi originali.
Usare la data nel nome del file
Un formato molto utile per archiviare documenti è AAAA-MM-GG_descrizione.ext. La data in questo ordine fa sì che l'ordinamento alfabetico coincida con quello cronologico. Python può ricavarla dalla data di ultima modifica:
from datetime import datetime
data = datetime.fromtimestamp(file.stat().st_mtime).strftime("%Y-%m-%d")
nuovo = file.with_name(f"{data}_{file.stem}{file.suffix}")
Attenzione però: la data di modifica cambia se il file viene copiato con alcuni strumenti o modificato. Per le foto è più affidabile la data di scatto contenuta nei metadati EXIF, che si legge con librerie come Pillow. Per i documenti, a volte la data giusta è scritta nel nome stesso o nel contenuto: in quel caso conviene estrarla con un'espressione regolare.
Gestire i conflitti di nome
Il rischio più serio è che due file finiscano con lo stesso nome. Su Windows rename() solleva un errore se la destinazione esiste; su Linux e macOS, invece, sovrascrive silenziosamente il file di destinazione. Per questo è bene controllare sempre:
if nuovo.exists():
print("Conflitto, salto:", nuovo.name)
continue
Un'altra soluzione è aggiungere un suffisso progressivo (_2, _3) finché il nome non è libero. In ogni caso il conflitto va gestito esplicitamente, non lasciato al caso.
C'è anche un caso subdolo: rinominare a.txt in b.txt e b.txt in c.txt nello stesso ciclo. Se l'ordine è sbagliato, il primo passaggio trova b.txt ancora occupato. Quando le regole possono incrociarsi, conviene rinominare in due fasi: prima tutti i file con un nome temporaneo, poi con quello definitivo.
Tenere un registro delle modifiche
Uno script ben fatto lascia traccia di ciò che ha fatto. Un semplice file CSV con due colonne, nome vecchio e nome nuovo, permette di annullare l'operazione in qualsiasi momento con uno script inverso.
import csv
with open("registro_rinomina.csv", "a", newline="", encoding="utf-8") as f:
csv.writer(f).writerow([file.name, nuovo.name])
Il registro è utile anche per rispondere alla domanda che prima o poi qualcuno farà: «dov'è finito il file che si chiamava così?».
Caratteri da evitare nei nomi
Quando il nuovo nome nasce da dati esterni, ad esempio il nome di un cliente preso da un foglio di calcolo, bisogna ripulirlo. Su Windows i caratteri \ / : * ? " < > | non sono ammessi, e anche spazi finali e punti finali creano problemi. Una piccola funzione che sostituisce questi caratteri con un trattino basso e rimuove gli spazi in eccesso evita errori difficili da diagnosticare.
| Situazione | Rischio | Contromisura |
|---|---|---|
| Nomi uguali | Sovrascrittura o errore | Controllo exists() |
| Regole incrociate | Conflitti a catena | Rinomina in due fasi |
| Caratteri vietati | Errore su Windows | Funzione di pulizia |
| Errore nella regola | Nomi sbagliati in massa | Prova a vuoto e registro |
Dalla prova al lavoro ricorrente
Una volta collaudato, lo script può ricevere la cartella come argomento da riga di comando, così da usarlo su archivi diversi senza modificarlo. Il passo successivo è pianificarlo, ad esempio ogni sera sulla cartella delle scansioni in arrivo. A quel punto la prova a vuoto resta comunque utile: basta eseguirla ogni volta che si modifica la regola.
In sintesi
pathlibrende la rinomina in blocco semplice e leggibile, con poche righe di codice.- Eseguite sempre prima una prova a vuoto che stampa le trasformazioni senza applicarle.
- Usate date in formato
AAAA-MM-GGe numeri con zeri iniziali per un ordinamento corretto. - Gestite in modo esplicito conflitti di nome e caratteri non ammessi.
- Registrate ogni modifica in un CSV per poterla annullare.