Batch wijziging van een bestandsnaam in Python door het toevoegen van een string of sequentieel nummer voor en na de bestandsnaam

Bedrijf

Hernoem in bulk met behulp van de os module en glob module.

Gebruik de module os en de module glob om de bestandsnamen in een map in bulk te wijzigen en te hernoemen door reeksen of opeenvolgende getallen voor en na de bestandsnamen toe te voegen.

Voorbeeld bestandsstructuur

Neem de volgende bestandsstructuur als voorbeeld. In dit geval wordt aangenomen dat er alleen bestanden (geen mappen) in de map staan.

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

Dingen om in gedachten te houden

Aangezien het proces inhoudt dat het bestand een andere naam krijgt, moet het oorspronkelijke bestand apart worden opgeslagen, zodat het kan worden bewaard in geval van een mislukking.

Verkrijg de bestandslijst met de glob module

De glob module zal alle padnamen vinden die overeenkomen met het opgegeven patroon volgens de regels die door de Unix shell worden gebruikt.
glob — Unix style pathname pattern expansion — Python 3.10.0 Documentation

De volgende functie kan bijvoorbeeld worden gebruikt om een lijst op te vragen van de namen van bestanden en mappen in de huidige directory.
glob.glob('./*')
Het argument kan een absoluut pad of een relatief pad zijn.

In dit voorbeeld zou het er als volgt uitzien.

import glob

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

In plaats van a.jpg kun je het volgende krijgen, met het argument path toegevoegd.
./testdir/a.jpg

U kunt ook jokertekens (*) gebruiken om alleen specifieke extensies te krijgen, zoals hieronder getoond.
glob.glob('./testdir/*.jpg')

De volgende patroonherkenning kan worden gebruikt.

  • *: Past overal bij.
  • ?Zoekt elk afzonderlijk teken.
  • [abc]: Zoekt één enkel teken uit a, b, of c.
  • [!abc]: Zoekt één enkel teken anders dan a, b, of c

Hernoemen met os.rename()

os.rename(src, dst, *, src_dir_fd=None, dst_dir_fd=None)
Hernoem het bestand of de directory src naar dst.
os — Miscellaneous operating system interfaces — Python 3.10.0 Documentation

Gebruik de functie rename() van de os module, die het zal hernoemen zoals de naam doet vermoeden.

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

Dan zal a.jpg hernoemd worden naar a_000.jpg.

Nul-gevulde opeenvolgende getallen genereren met str.format()

Als we bijvoorbeeld opeenvolgende nummers toevoegen aan tientallen bestanden, willen we “00” of “11” gebruiken in plaats van “0” of “1”. Als je de nullen op deze manier wilt invullen, gebruik dan de str.format() methode.

str.format(args,*kwargs)
Voert string opmaak operaties uit. De tekenreeks die deze methode aanroept kan normale tekens of substitutievelden bevatten, gescheiden door {}.Built-in Types — Python 3.10.0 Documentation

Syntaxis van formaat specificatiestrings
De opmaakstring bevat het “vervangingsveld” tussen gekrulde haakjes {}.

De syntaxis van het vervangingsveld is als volgt:
replacement_field ::= "{" [field_name] ["!" conversion] [":" format_spec] "}"

Eenvoudiger gezegd: het vervangingsveld begint met field_name, waardoor de waarde van het opgegeven object wordt opgemaakt en in de uitvoer wordt ingevoegd in plaats van het vervangingsveld. Na de veld_naam kan het conversieveld gevolgd worden door een uitroepteken '! Na de veld_naam kan het conversieveld gevolgd worden door een uitroepteken '! De format_spec kan geschreven worden met een dubbele punt ':' op het einde. Dit specificeert het niet-standaard formaat van de waarde die moet worden vervangen.
string — Common string operations — Python 3.10.0 Documentation

Als je het voor nu met 0 wilt vullen, doe dan het volgende.

# 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

Voorbeeld van code om een volgnummer aan een bestand toe te voegen

Haal eerst de bestandsnaam op met os.path.basename(). Voeg vervolgens een tekenreeks of volgnummer toe voor de bestandsnaam, en voeg dit samen met het oorspronkelijke pad met os.path.join().

Het volgende voorbeeld voegt img_ toe aan de voorkant van alle bestandsnamen.

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

Het resultaat is als volgt.

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

Als je opeenvolgende getallen wilt toevoegen, verander dan het for statement in iets als dit: enumerate() om de getallen geteld te krijgen in volgorde vanaf 0. In dit geval wordt het getal gevuld met drie cijfers.

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

Hier is het resultaat.

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

Als je met 1 wilt beginnen in plaats van met 0, stel dan het tweede argument van opsommen in op 1.

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

Het gaat als volgt.

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

Voorbeeld van code om een volgnummer toe te voegen na een bestand

Gebruik os.path.splitext() om het bestand te splitsen in extensie en hoofdpad, en voeg dan tekenreeksen of opeenvolgende getallen toe aan het hoofdpad. In het volgende voorbeeld wordt _img toegevoegd na alle bestandsnamen.

import os
import glob

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

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

Het resultaat is dit.

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

Net als bij het toevoegen van een volgnummer vóór een bestand, verandert u de for-instructie als u een volgnummer toevoegt.

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