Cambia in batch il nome di un file in Python aggiungendo una stringa o un numero sequenziale prima e dopo il nome del file

Attività commerciale

Rinomina in blocco usando il modulo os e il modulo glob.

Usate il modulo os e il modulo glob per cambiare e rinominare i nomi dei file in una cartella in blocco aggiungendo stringhe o numeri sequenziali prima e dopo i nomi dei file.

Esempio di struttura del file

Prendiamo come esempio la seguente struttura di file. In questo caso, si presume che ci siano solo file (nessuna cartella) nella cartella.

.
└── testdir
    ├── a.jpg
    ├── b.jpg
    ├── c.jpg
    ├── d.jpg
    └── e.jpg

Cose da tenere a mente

Poiché il processo implica la ridenominazione del file, salvate il file originale separatamente in modo da poterlo salvare in caso di fallimento.

Ottenere l'elenco dei file con il modulo glob

Il modulo glob troverà tutti i nomi di percorso che corrispondono allo schema specificato secondo le regole usate dalla shell Unix.
glob — Unix style pathname pattern expansion — Python 3.10.0 Documentation

Per esempio, la seguente funzione può essere usata per ottenere una lista di nomi di file e directory nella directory corrente.
glob.glob('./*')
L'argomento può essere un percorso assoluto o un percorso relativo.

In questo esempio, sarebbe come il seguente.

import glob

print(glob.glob('./testdir/*'))
# => ['./testdir/a.jpg', './testdir/b.jpg', './testdir/c.jpg', './testdir/d.jpg', './testdir/e.jpg']

Invece di a.jpg, potete ottenere il seguente, con l'aggiunta del percorso dell'argomento.
./testdir/a.jpg

Puoi anche usare i caratteri jolly (*) per ottenere solo estensioni specifiche, come mostrato qui sotto.
glob.glob('./testdir/*.jpg')

Si può usare il seguente pattern matching.

  • *: Corrisponde a tutto.
  • ?Corrisponde a qualsiasi singolo carattere.
  • [abc]: Corrisponde a un singolo carattere di a, b o c.
  • [!abc]: Corrisponde a un singolo carattere diverso da a, b o c

Rinominare con os.rename()

os.rename(src, dst, *, src_dir_fd=None, dst_dir_fd=None)
Rinomina il file o la directory src in dst.
os — Miscellaneous operating system interfaces — Python 3.10.0 Documentation

Usate la funzione rename() del modulo os, che lo rinominerà come suggerisce il nome.

import os
os.rename('./testdir/a.jpg', './testdir/a_000.jpg')

Poi, a.jpg sarà rinominato in a_000.jpg.

Generare numeri sequenziali riempiti di zero con str.format()

Per esempio, quando si aggiungono numeri sequenziali a dozzine di file, vogliamo usare “00” o “11” invece di “0” o “1”. Se volete riempire gli zeri in questo modo, usate il metodo str.format().

str.format(args,*kwargs)
Esegue operazioni di formattazione delle stringhe. La stringa che invoca questo metodo può contenere caratteri normali o campi di sostituzione separati da {}.Built-in Types — Python 3.10.0 Documentation

Sintassi delle stringhe di specificazione del formato
La stringa di formattazione contiene il “campo di sostituzione” racchiuso tra parentesi graffe {}.

La sintassi del campo di sostituzione è la seguente:
replacement_field ::= "{" [field_name] ["!" conversion] [":" format_spec] "}"

In termini più semplici, il campo di sostituzione inizia con field_name, che fa sì che il valore dell'oggetto specificato sia formattato e inserito nell'output al posto del campo di sostituzione. Dopo il nome_campo, il campo di conversione può essere seguito da un punto esclamativo '! Il format_spec può essere scritto con i due punti ':' alla fine. Questo specifica il formato non predefinito del valore da sostituire.
string — Common string operations — Python 3.10.0 Documentation

Se volete riempirlo con 0 per ora, fate come segue.

# 3を2桁でゼロ埋め
print('{0:02d}'.format(3))
# => 03

# Fill in the zeros with three and four digits for 4 and 6, respectively.
print('{0:03d}, {1:04d}'.format(4, 6))
# => 004, 0006

Esempio di codice per aggiungere un numero sequenziale di stringhe prima di un file

Per prima cosa, ottenete il nome del file con os.path.basename(). Poi, aggiungete una stringa o un numero sequenziale davanti al nome del file, e concatenatelo con il percorso originale con os.path.join().

L'esempio seguente aggiunge img_ all'inizio di tutti i nomi di file.

import os
import glob

path = "./testdir"
files = glob.glob(path + '/*')

for f in files:
    os.rename(f, os.path.join(path, 'img_' + os.path.basename(f)))

Il risultato è il seguente.

.
└── testdir
    ├── img_a.jpg
    ├── img_b.jpg
    ├── img_c.jpg
    ├── img_d.jpg
    └── img_e.jpg

Se volete aggiungere numeri sequenziali, cambiate l'istruzione for in qualcosa come questo: enumerate() per ottenere i numeri contati in ordine da 0. In questo caso, il numero è riempito con tre cifre.

for i, f in enumerate(files):
    os.rename(f, os.path.join(path, '{0:03d}'.format(i) +
                              '_' + os.path.basename(f)))

Ecco il risultato.

.
└── testdir
    ├── 000_a.jpg
    ├── 001_b.jpg
    ├── 002_c.jpg
    ├── 003_d.jpg
    └── 004_e.jpg

Se volete iniziare con 1 invece di 0, impostate il secondo argomento di enumerate a 1.

for i, f in enumerate(files, 1):
    os.rename(f, os.path.join(path, '{0:03d}'.format(i) +
                              '_' + os.path.basename(f)))

Funziona così.

.
└── testdir
    ├── 001_a.jpg
    ├── 002_b.jpg
    ├── 003_c.jpg
    ├── 004_d.jpg
    └── 005_e.jpg

Esempio di codice per aggiungere un numero sequenziale di stringhe dopo un file

Usate os.path.splitext() per dividere il file in estensione e percorso principale, e poi aggiungete stringhe o numeri sequenziali al percorso principale. Nel seguente esempio, _img viene aggiunto dopo tutti i nomi dei file.

import os
import glob

files = glob.glob('./testdir/*')

for f in files:
    ftitle, fext = os.path.splitext(f)
    os.rename(f, ftitle + '_img' + fext)

Il risultato è questo.

.
└── testdir
    ├── a_img.jpg
    ├── b_img.jpg
    ├── c_img.jpg
    ├── d_img.jpg
    └── e_img.jpg

Come per l'aggiunta di un numero sequenziale di stringhe prima di un file, cambiate l'istruzione for quando aggiungete un numero sequenziale.

for i, f in enumerate(files):
    ftitle, fext = os.path.splitext(f)
    os.rename(f, ftitle + '_' + '{0:03d}'.format(i) + fext)
.
└── testdir
    ├── a_000.jpg
    ├── b_001.jpg
    ├── c_002.jpg
    ├── d_003.jpg
    └── e_004.jpg
Copied title and URL