- Hernoem in bulk met behulp van de os module en glob module.
- Verkrijg de bestandslijst met de glob module
- Hernoemen met os.rename()
- Nul-gevulde opeenvolgende getallen genereren met str.format()
- Voorbeeld van code om een volgnummer aan een bestand toe te voegen
- Voorbeeld van code om een volgnummer toe te voegen na een bestand
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