Batch ændre et filnavn i Python ved at tilføje en streng eller et fortløbende nummer før og efter filnavnet

Forretning

Omdøb i massevis ved hjælp af os-modulet og glob-modulet.

Brug os-modulet og glob-modulet til at ændre og omdøbe filnavne i en mappe i massevis ved at tilføje strenge eller fortløbende numre før og efter filnavnene.

Eksempel på filstruktur

Tag følgende filstruktur som et eksempel. I dette tilfælde antages det, at der kun er filer (ingen mapper) i mappen.

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

Ting, du skal huske på

Da processen indebærer en omdøbning af filen, skal du gemme den originale fil separat, så den kan gemmes i tilfælde af fejl.

Hent fillisten med glob-modulet

Glob-modulet finder alle de stinavne, der passer til det angivne mønster i henhold til de regler, der anvendes af Unix-shell'en.
glob — Unix style pathname pattern expansion — Python 3.10.0 Documentation

Følgende funktion kan f.eks. bruges til at få en liste over navne på filer og mapper i den aktuelle mappe.
glob.glob('./*')
Argumentet kan være en absolut sti eller en relativ sti.

I dette eksempel ville det se ud som følger.

import glob

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

I stedet for a.jpg kan du få følgende med tilføjelsen af argumentet sti.
./testdir/a.jpg

Du kan også bruge jokertegn (*) for kun at få vist bestemte filtypenavne, som vist nedenfor.
glob.glob('./testdir/*.jpg')

Der kan anvendes følgende mønstermatchning.

  • *: Passer til alt.
  • ?Passer til et hvilket som helst enkelt tegn.
  • [abc]: Matcher et enkelt tegn fra a, b eller c.
  • [!abc]: Passer til et enkelt tegn ud over a, b eller c

Omdøb med os.rename()

os.rename(src, dst, *, src_dir_fd=None, dst_dir_fd=None)
Omdøb filen eller mappen src til dst.
os — Miscellaneous operating system interfaces — Python 3.10.0 Documentation

Brug funktionen rename() i os-modulet, som omdøber den som navnet antyder.

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

Derefter vil a.jpg blive omdøbt til a_000.jpg.

Generering af sekventielle numre fyldt med nul med str.format()

Når vi f.eks. tilføjer fortløbende numre til snesevis af filer, skal vi bruge “00” eller “11” i stedet for “0” eller “1”. Hvis du ønsker at udfylde nuller på denne måde, skal du bruge metoden str.format().

str.format(args,*kwargs)
Udfører formateringsoperationer for strenge. Den streng, der påkalder denne metode, kan indeholde normale tegn eller erstatningsfelter adskilt af {}.Built-in Types — Python 3.10.0 Documentation

Syntaks for formatspecifikationsstrenge
Formateringsstrengen indeholder “erstatningsfeltet” omgivet af krøllede parenteser {}.

Syntaksen for erstatningsfeltet er som følger:
replacement_field ::= "{" [field_name] ["!" conversion] [":" format_spec] "}"

I enklere vendinger starter erstatningsfeltet med field_name, hvilket bevirker, at værdien af det angivne objekt formateres og indsættes i output i stedet for erstatningsfeltet. Efter field_name kan konverteringsfeltet efterfølges af et udråbstegn '! Efter field_name kan konverteringsfeltet efterfølges af et udråbstegn '! Format_spec kan skrives med et kolon ':' i slutningen. Dette angiver det format, der ikke er standardformatet for den værdi, der skal erstattes.
string — Common string operations — Python 3.10.0 Documentation

Hvis du ønsker at udfylde den med 0 indtil videre, skal du gøre følgende.

# 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

Eksempel på kode til at tilføje et string\følgenummer før en fil

Først skal du hente filnavnet med os.path.basename(). Derefter tilføjes en streng eller et fortløbende nummer foran filnavnet, og det sammenkædes med den oprindelige sti med os.path.join().

I det følgende eksempel tilføjes img_ foran alle filnavne.

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

Resultatet er som følger.

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

Hvis du vil tilføje fortløbende numre, skal du ændre for-angivelsen til noget i stil med dette: enumerate() for at få tallene talt i rækkefølge fra 0. I dette tilfælde er tallet fyldt med tre cifre.

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

Her er resultatet.

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

Hvis du ønsker at starte med 1 i stedet for 0, skal du sætte det andet argument i enumerate til 1.

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

Det foregår på denne måde.

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

Eksempel på kode til at tilføje et string\følgenummer efter en fil

Brug os.path.splitext() til at opdele filen i udvidelse og rodsti, og tilføj derefter strenge eller fortløbende numre til rodstien. I det følgende eksempel tilføjes _img efter alle filnavne.

import os
import glob

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

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

Resultatet er følgende.

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

Som ved tilføjelse af et string\følgenummer før en fil skal du ændre for-angivelsen, når du tilføjer et følgenummer.

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