Skupna promjena naziva datoteke u Pythonu dodavanjem niza ili sekvencijalnog broja prije i iza naziva datoteke

Poslovanje

Skupno preimenujte pomoću os modula i glob modula.

Upotrijebite os modul i glob modul za promjenu i preimenovanje naziva datoteka u mapi masovno dodavanjem nizova ili uzastopnih brojeva ispred i iza naziva datoteka.

Primjer strukture datoteke

Uzmite sljedeću strukturu datoteke kao primjer. U ovom slučaju, pretpostavlja se da u mapi postoje samo datoteke (nema mapa).

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

Stvari koje treba imati na umu

Budući da proces uključuje preimenovanje datoteke, spremite originalnu datoteku zasebno kako bi se mogla spremiti u slučaju neuspjeha.

Nabavite popis datoteka s glob modulom

Modul glob će pronaći sve nazive puteva koji odgovaraju navedenom uzorku prema pravilima koja koristi Unix ljuska.
glob — Unix style pathname pattern expansion — Python 3.10.0 Documentation

Na primjer, sljedeća funkcija može se koristiti za dobivanje popisa imena datoteka i imenika u trenutnom direktoriju.
glob.glob('./*')
Argument može biti apsolutni ili relativni put.

U ovom primjeru to bi izgledalo ovako.

import glob

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

Umjesto a.jpg, možete dobiti sljedeće, s dodanom stazom argumenta.
./testdir/a.jpg

Također možete koristiti zamjenske znakove (*) da biste dobili samo određena proširenja, kao što je prikazano u nastavku.
glob.glob('./testdir/*.jpg')

Može se koristiti sljedeće podudaranje uzoraka.

  • *: Odgovara svemu.
  • ?Odgovara bilo kojem pojedinačnom znaku.
  • [abc]: odgovara jednom znaku iz a, b ili c.
  • [!abc]: Odgovara samo jednom znaku osim a, b ili c

Preimenuj pomoću os.rename()

os.rename(src, dst, *, src_dir_fd=None, dst_dir_fd=None)
Preimenujte datoteku ili direktorij src u dst.
os — Miscellaneous operating system interfaces — Python 3.10.0 Documentation

Upotrijebite funkciju rename() os modula, koja će ga preimenovati kako ime sugerira.

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

Zatim će a.jpg biti preimenovan u a_000.jpg.

Generiranje sekvencijalnih brojeva ispunjenih nulom pomoću str.format()

Na primjer, kada dodajemo uzastopne brojeve na desetke datoteka, želimo koristiti “00” ili “11” umjesto “0” ili “1”. Ako želite ispuniti nule na ovaj način, koristite metodu str.format().

str.format(args,*kwargs)
Izvodi operacije oblikovanja niza. Niz koji poziva ovu metodu može sadržavati normalne znakove ili zamjenska polja odvojena {}.Built-in Types — Python 3.10.0 Documentation

Sintaksa nizova specifikacije formata
Niz za oblikovanje sadrži “zamjensko polje” zatvoreno u vitičaste zagrade {}.

Sintaksa zamjenskog polja je sljedeća:
replacement_field ::= "{" [field_name] ["!" conversion] [":" format_spec] "}"

Jednostavnije rečeno, zamjensko polje počinje s field_name, što uzrokuje da se vrijednost navedenog objekta formatira i umetne u izlaz umjesto zamjenskog polja. Nakon polja_name, polje za pretvorbu može biti praćeno uskličnikom ‘! Nakon polja_name, polje za pretvorbu može biti praćeno uskličnikom ‘! Format_spec može se napisati s dvotočkom ‘:’ na kraju. Ovo određuje nezadani format vrijednosti koja se zamjenjuje.
string — Common string operations — Python 3.10.0 Documentation

Ako ga za sada želite ispuniti s 0, učinite sljedeće.

# 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

Primjer koda za dodavanje niza/slijednog broja prije datoteke

Prvo uzmite naziv datoteke pomoću os.path.basename(). Zatim dodajte niz ili sekvencijalni broj ispred naziva datoteke i spojite ga s izvornom stazom pomoću os.path.join().

Sljedeći primjer dodaje img_ na početak svih naziva datoteka.

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

Rezultat je sljedeći.

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

Ako želite dodati sekvencijalne brojeve, promijenite izraz for u nešto poput ovoga: enumerate() da biste dobili brojeve koji se broje redom od 0. U ovom slučaju, broj je ispunjen s tri znamenke.

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

Evo rezultata.

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

Ako želite započeti s 1 umjesto 0, postavite drugi argument enumerate na 1.

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

To ide ovako.

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

Primjer koda za dodavanje niza/slijednog broja nakon datoteke

Koristite os.path.splitext() da biste datoteku podijelili na ekstenziju i korijenski put, a zatim dodajte nizove ili sekvencijalne brojeve korijenskom putu. U sljedećem primjeru, _img se dodaje iza svih naziva datoteka.

import os
import glob

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

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

Rezultat je ovaj.

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

Kao i kod dodavanja niza/slijednog broja prije datoteke, promijenite naredbu for kada dodajete sekvencijalni broj.

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