Batch-Änderung eines Dateinamens in Python durch Hinzufügen einer Zeichenkette oder einer fortlaufenden Nummer vor und nach dem Dateinamen

Geschäft

Umbenennen in der Masse mit dem os-Modul und glob-Modul.

Verwenden Sie das os-Modul und das glob-Modul, um die Dateinamen in einem Ordner in großen Mengen zu ändern und umzubenennen, indem Sie Zeichenketten oder fortlaufende Nummern vor und nach den Dateinamen hinzufügen.

Beispiel einer Dateistruktur

Nehmen Sie die folgende Dateistruktur als Beispiel. In diesem Fall wird davon ausgegangen, dass sich nur Dateien (keine Ordner) in dem Ordner befinden.

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

Zu beachtende Dinge

Da der Vorgang eine Umbenennung der Datei beinhaltet, sollten Sie die Originaldatei separat speichern, damit sie im Falle eines Fehlers gesichert werden kann.

Abrufen der Dateiliste mit dem glob-Modul

Das glob-Modul findet alle Pfadnamen, die mit dem angegebenen Muster übereinstimmen, gemäß den von der Unix-Shell verwendeten Regeln.
glob — Unix style pathname pattern expansion — Python 3.10.0 Documentation

Die folgende Funktion kann zum Beispiel verwendet werden, um eine Liste der Datei- und Verzeichnisnamen im aktuellen Verzeichnis zu erhalten.
glob.glob('./*')
Das Argument kann ein absoluter Pfad oder ein relativer Pfad sein.

In diesem Beispiel würde es wie folgt aussehen.

import glob

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

Anstelle von a.jpg können Sie folgendes erhalten, wobei das Argument path hinzugefügt wird.
./testdir/a.jpg

Sie können auch Platzhalter (*) verwenden, um nur bestimmte Erweiterungen zu erhalten, wie unten gezeigt.
glob.glob('./testdir/*.jpg')

Der folgende Mustervergleich kann verwendet werden.

  • *: Passt zu allem.
  • ?Passt auf jedes einzelne Zeichen.
  • [abc]: Entspricht einem einzelnen Zeichen aus a, b oder c.
  • [!abc]: Passt auf ein einzelnes Zeichen, das nicht a, b oder c ist

Umbenennen mit os.rename()

os.rename(src, dst, *, src_dir_fd=None, dst_dir_fd=None)
Benennen Sie die Datei oder das Verzeichnis src in dst um.
os — Miscellaneous operating system interfaces — Python 3.10.0 Documentation

Benutzen Sie die Funktion rename() des os-Moduls, die es umbenennt, wie der Name schon sagt.

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

Dann wird a.jpg in a_000.jpg umbenannt.

Erzeugen von mit Nullen gefüllten fortlaufenden Zahlen mit str.format()

Wenn wir zum Beispiel Dutzenden von Dateien fortlaufende Nummern hinzufügen, wollen wir “00” oder “11” anstelle von “0” oder “1” verwenden. Wenn Sie die Nullen auf diese Weise einfügen möchten, verwenden Sie die Methode str.format().

str.format(args,*kwargs)
Führt Operationen zur Formatierung von Zeichenketten durch. Die Zeichenfolge, die diese Methode aufruft, kann normale Zeichen oder durch {} getrennte Ersetzungsfelder enthalten.Built-in Types — Python 3.10.0 Documentation

Syntax von Formatierungszeichenfolgen
Die Formatierungszeichenfolge enthält das in geschweiften Klammern {} eingeschlossene “Ersatzfeld”.

Die Syntax des Ersetzungsfeldes lautet wie folgt:
replacement_field ::= "{" [field_name] ["!" conversion] [":" format_spec] "}"

Vereinfacht ausgedrückt, beginnt das Ersetzungsfeld mit field_name, was dazu führt, dass der Wert des angegebenen Objekts formatiert und anstelle des Ersetzungsfeldes in die Ausgabe eingefügt wird. Nach dem field_name kann dem Konvertierungsfeld ein Ausrufezeichen '! folgen. Nach dem field_name kann dem Konvertierungsfeld ein Ausrufezeichen '! folgen. Die format_spec kann mit einem Doppelpunkt ':' am Ende geschrieben werden. Dies gibt das nicht standardmäßige Format des zu ersetzenden Wertes an.
string — Common string operations — Python 3.10.0 Documentation

Wenn Sie ihn vorerst mit 0 füllen wollen, gehen Sie wie folgt vor.

# 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

Beispiel für einen Code zum Hinzufügen einer fortlaufenden Nummer vor einer Datei

Ermitteln Sie zunächst den Dateinamen mit os.path.basename(). Fügen Sie dann eine Zeichenkette oder eine fortlaufende Nummer vor dem Dateinamen ein und verbinden Sie diese mit dem ursprünglichen Pfad mit os.path.join().

Im folgenden Beispiel wird allen Dateinamen img_ vorangestellt.

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

Das Ergebnis ist wie folgt.

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

Wenn Sie fortlaufende Nummern hinzufügen möchten, ändern Sie die for-Anweisung in etwas wie dieses: enumerate(), um die Nummern in der Reihenfolge von 0 an zu erhalten. In diesem Fall wird die Nummer mit drei Ziffern gefüllt.

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

Hier ist das Ergebnis.

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

Wenn Sie mit 1 anstelle von 0 beginnen wollen, setzen Sie das zweite Argument von enumerate auf 1.

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

Das geht so.

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

Beispiel für einen Code zum Hinzufügen einer fortlaufenden Nummer nach einer Datei

Verwenden Sie os.path.splitext(), um die Datei in Erweiterung und Stammpfad aufzuteilen, und fügen Sie dann Zeichenketten oder fortlaufende Nummern an den Stammpfad an. Im folgenden Beispiel wird _img nach allen Dateinamen hinzugefügt.

import os
import glob

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

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

Das Ergebnis ist folgendes.

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

Wie beim Hinzufügen einer fortlaufenden Nummer vor einer Datei muss auch beim Hinzufügen einer fortlaufenden Nummer die for-Anweisung geändert werden.

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