- Rinomina in blocco usando il modulo os e il modulo glob.
- Ottenere l'elenco dei file con il modulo glob
- Rinominare con os.rename()
- Generare numeri sequenziali riempiti di zero con str.format()
- Esempio di codice per aggiungere un numero sequenziale di stringhe prima di un file
- Esempio di codice per aggiungere un numero sequenziale di stringhe dopo un file
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