Changez par lots le nom d’un fichier en Python en ajoutant une chaîne ou un numéro séquentiel avant et après le nom du fichier.

Affaires

Renommer en masse en utilisant le module os et le module glob.

Utilisez le module os et le module glob pour modifier et renommer les noms de fichiers d'un dossier en vrac en ajoutant des chaînes de caractères ou des numéros séquentiels avant et après les noms de fichiers.

Exemple de structure de fichier

Prenons l'exemple de la structure de fichiers suivante. Dans ce cas, on suppose qu'il n'y a que des fichiers (pas de dossiers) dans le dossier.

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

Points à garder à l'esprit

Comme le processus implique de renommer le fichier, sauvegardez le fichier original séparément afin de pouvoir le conserver en cas d'échec.

Obtenir la liste des fichiers avec le module glob

Le module glob trouvera tous les noms de chemin qui correspondent au motif spécifié selon les règles utilisées par le shell Unix.
glob — Unix style pathname pattern expansion — Python 3.10.0 Documentation

Par exemple, la fonction suivante peut être utilisée pour obtenir une liste des noms de fichiers et de répertoires dans le répertoire actuel.
glob.glob('./*')
L'argument peut être un chemin absolu ou un chemin relatif.

Dans cet exemple, cela ressemblerait à ce qui suit.

import glob

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

Au lieu de a.jpg, vous pouvez obtenir ce qui suit, avec l'argument chemin ajouté.
./testdir/a.jpg

Vous pouvez également utiliser des caractères génériques (*) pour obtenir uniquement des extensions spécifiques, comme indiqué ci-dessous.
glob.glob('./testdir/*.jpg')

Le filtrage suivant peut être utilisé.

  • *: Correspond à tout.
  • ?Correspond à n'importe quel caractère unique.
  • [abc]: Correspond à un seul caractère de a, b ou c.
  • [!abc]: Correspond à un seul caractère autre que a, b ou c.

Renommer avec os.rename()

os.rename(src, dst, *, src_dir_fd=None, dst_dir_fd=None)
Renomme le fichier ou le répertoire src en dst.
os — Miscellaneous operating system interfaces — Python 3.10.0 Documentation

Utilisez la fonction rename() du module os, qui le renommera comme son nom l'indique.

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

Ensuite, le fichier a.jpg sera renommé en a_000.jpg.

Génération de nombres séquentiels remplis de zéro avec str.format()

Par exemple, lorsque nous ajoutons des numéros séquentiels à des dizaines de fichiers, nous voulons utiliser “00” ou “11” au lieu de “0” ou “1”. Si vous voulez remplir les zéros de cette manière, utilisez la méthode str.format().

str.format(args,*kwargs)
Effectue des opérations de formatage de chaînes de caractères. La chaîne qui invoque cette méthode peut contenir des caractères normaux ou des champs de substitution séparés par des {}.Built-in Types — Python 3.10.0 Documentation

Syntaxe des chaînes de spécification de format
La chaîne de formatage contient le “champ de remplacement” entre crochets {}.

La syntaxe du champ de remplacement est la suivante :
replacement_field ::= "{" [field_name] ["!" conversion] [":" format_spec] "}"

En termes plus simples, le champ de remplacement commence par field_name, ce qui entraîne le formatage de la valeur de l'objet spécifié et son insertion dans la sortie à la place du champ de remplacement. Après le nom du champ, le champ de conversion peut être suivi d'un point d'exclamation ' ! Après le nom du champ, le champ de conversion peut être suivi d'un point d'exclamation ' ! La spécification de format peut être écrite avec deux points ':' à la fin. Cela permet de spécifier le format non par défaut de la valeur à remplacer.
string — Common string operations — Python 3.10.0 Documentation

Si vous voulez le remplir avec 0 pour le moment, faites ce qui suit.

# 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

Exemple de code pour ajouter un numéro séquentiel de chaîne de caractères avant un fichier

Tout d'abord, récupérez le nom du fichier avec os.path.basename(). Ensuite, ajoutez une chaîne ou un numéro séquentiel devant le nom du fichier, et concaténérez-le avec le chemin d'origine avec os.path.join().

L'exemple suivant ajoute img_ au début de tous les noms de fichiers.

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

Le résultat est le suivant.

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

Si vous voulez ajouter des numéros séquentiels, changez l'instruction for par quelque chose comme ceci : enumerate() pour obtenir les numéros comptés dans l'ordre à partir de 0. Dans ce cas, le numéro est rempli de trois chiffres.

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

Voici le résultat.

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

Si vous voulez commencer par 1 au lieu de 0, mettez le deuxième argument de enumerate à 1.

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

C'est comme ça.

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

Exemple de code pour ajouter un numéro séquentiel de chaîne après un fichier

Utilisez os.path.splitext() pour diviser le fichier en extension et en chemin racine, puis ajoutez des chaînes ou des nombres séquentiels au chemin racine. Dans l'exemple suivant, _img est ajouté après tous les noms de fichiers.

import os
import glob

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

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

Le résultat est le suivant.

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

Comme pour l'ajout d'un numéro séquentiel avant un fichier, modifiez l'instruction for lorsque vous ajoutez un numéro séquentiel.

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