Fájlnév kötegelt módosítása Pythonban a fájlnév előtt és után egy karakterlánc vagy sorszám hozzáadásával

Üzleti

Tömeges átnevezés az os modul és a glob modul használatával.

Az os modul és a glob modul segítségével tömegesen megváltoztathatja és átnevezheti a mappában lévő fájlneveket a fájlnevek előtti és utáni karakterláncok vagy sorszámok hozzáadásával.

Példa fájlszerkezet

Vegyük példaként a következő fájlszerkezetet. Ebben az esetben feltételezzük, hogy a mappában csak fájlok vannak (mappák nélkül).

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

Amit szem előtt kell tartani

Mivel a folyamat a fájl átnevezésével jár, mentse el az eredeti fájlt külön, hogy hiba esetén is meg lehessen menteni.

A fájllista kinyerése a glob modullal

A glob modul megtalálja az összes olyan elérési utat, amely megfelel a megadott mintának a Unix shell által használt szabályok szerint.
glob — Unix style pathname pattern expansion — Python 3.10.0 Documentation

A következő függvény például az aktuális könyvtárban található fájl- és könyvtárnevek listájának lekérdezésére használható.
glob.glob('./*')
Az argumentum lehet abszolút vagy relatív elérési útvonal.

Ebben a példában ez a következőképpen nézne ki.

import glob

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

Az a.jpg helyett a következőt kaphatja, az argumentum útvonalának hozzáadásával.
./testdir/a.jpg

Vadjelzőket (*) is használhat, hogy csak bizonyos kiterjesztéseket kapjon, ahogy az alábbiakban látható.
glob.glob('./testdir/*.jpg')

A következő mintaillesztés használható.

  • *: Mindenhez passzol.
  • ?Egyezik bármelyik karakterrel.
  • [abc]: Egyezik az a, b vagy c karakterekkel.
  • [!abc]: Az a, b vagy c karakterektől eltérő egyetlen karaktert talál.

Átnevezés az os.rename() segítségével

os.rename(src, dst, *, src_dir_fd=None, dst_dir_fd=None)
Nevezze át az src fájlt vagy könyvtárat dst-re.
os — Miscellaneous operating system interfaces — Python 3.10.0 Documentation

Használja az os modul rename() függvényét, amely átnevezi a nevének megfelelően.

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

Ezután az a.jpg átneveződik a_000.jpg-re.

Nullával kitöltött sorszámok generálása str.format() segítségével

Például, amikor több tucat fájlhoz sorszámokat adunk hozzá, a “00” vagy “11” helyett a “0” vagy “1” számot akarjuk használni. Ha a nullákat ilyen módon szeretnénk kitölteni, használjuk az str.format() metódust.

str.format(args,*kwargs)
A karakterlánc formázási műveleteket végzi. Az ezt a metódust meghívó karakterlánc tartalmazhat normál karaktereket vagy {}-vel elválasztott helyettesítő mezőket.Built-in Types — Python 3.10.0 Documentation

A formátum-specifikációs karakterláncok szintaxisa
A formázási karakterlánc tartalmazza a {} szögletes zárójelbe zárt “csere mezőt”.

A csere mező szintaxisa a következő:
replacement_field ::= "{" [field_name] ["!" conversion] [":" format_spec] "}"

Egyszerűbben fogalmazva, a helyettesítő mező a field_name szóval kezdődik, ami azt eredményezi, hogy a megadott objektum értéke lesz formázva és beillesztve a kimenetbe a helyettesítő mező helyett. A field_name után a konverziós mezőt követheti egy felkiáltójel '! A field_name után a konverziós mezőt követheti egy felkiáltójel '! A format_spec írható kettőspont ':' végződéssel. Ez a helyettesítendő érték nem alapértelmezett formátumát adja meg.
string — Common string operations — Python 3.10.0 Documentation

Ha egyelőre 0-val szeretné kitölteni, tegye a következőket.

# 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

Kódpélda egy string\sequenciális szám hozzáadására egy fájl előtt

Először az os.path.basename() segítségével szerezzük meg a fájl nevét. Ezután adjunk egy sztringet vagy sorszámot a fájlnév elé, és az os.path.join() segítségével kapcsoljuk össze az eredeti elérési úttal.

A következő példa az összes fájlnév elejéhez hozzáadja az img_ szót.

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

Az eredmény a következő.

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

Ha egymás utáni számokat akarsz hozzáadni, változtasd meg a for utasítást valami ilyesmire: enumerate(), hogy a számokat 0-tól kezdődő sorrendben számoljuk.

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

Íme az eredmény.

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

Ha 0 helyett 1-gyel szeretnénk kezdeni, akkor az enumerate második argumentumát állítsuk 1-re.

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

Ez így hangzik.

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

Példa egy string\sequenciális szám hozzáadására egy fájl után

Használja az os.path.splitext() funkciót a fájl kiterjesztésre és gyökérútra való felosztásához, majd adjon hozzá karakterláncokat vagy sorszámokat a gyökérúthoz. A következő példában a _img minden fájlnév után hozzáadódik.

import os
import glob

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

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

Az eredmény a következő.

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

Ahogyan a string\sequenciális szám hozzáadásánál a fájl előtt, a for utasítás megváltoztatásával a sorszám hozzáadásakor is változtassa meg a for utasítást.

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