Komek navek pelê di Python de bi lêzêdekirina rêzek an jimareyek rêzdar berî û piştî navê pelê biguhezîne

Dikan

Bi karanîna modula os û modula glob-ê bi girseyî navê xwe biguherînin.

Modula os û modula glob bikar bînin da ku navên pelan di peldankekê de bi girseyî biguhezînin û navên wan biguhezînin bi lê zêdekirina rêzan an hejmarên rêzkirî berî û piştî navên pelan.

Mînak avahiya pelê

Struktura pelê jêrîn wekî mînakek bigirin. Di vê rewşê de, tê texmîn kirin ku di peldankê de tenê pel hene (bê peldank).

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

Tiştên ku di hişê xwe de bimînin

Ji ber ku pêvajo bi navkirina pelê ve girêdayî ye, pelê orjînal ji hev cuda hilînin da ku di rewşek têkçûyî de were hilanîn.

Lîsteya pelê bi modula glob-ê bistînin

Modula glob dê hemî navên rêyên ku li gorî qaîdeyên ku ji hêla şêlê Unix-ê ve têne bikar anîn bi şêwaza diyarkirî re bibînin.
glob — Unix style pathname pattern expansion — Python 3.10.0 Documentation

Mînakî, fonksiyona jêrîn dikare were bikar anîn da ku navnîşek navên pel û pelrêça di pelrêça heyî de bigire.
glob.glob('./*')
Argument dikare rêyek mutleq an jî rêyek têkildar be.

Di vê nimûneyê de, ew ê wekî jêrîn xuya dike.

import glob

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

Li şûna a.jpg, hûn dikarin jêrîn bistînin, digel ku rêça argumana lê hatî zêdekirin.
./testdir/a.jpg

Her weha hûn dikarin kartên çolê (*) bikar bînin da ku tenê pêvekên taybetî bistînin, wekî ku li jêr tê xuyang kirin.
glob.glob('./testdir/*.jpg')

Lihevhatina nimûneya jêrîn dikare were bikar anîn.

  • *: Her tiştî li hev dike.
  • ?Bi her karakterek yekane re têkildar e.
  • [abc]: Ji tîpên a, b, an c bi yek tîpan li hev dike.
  • [!abc]: Ji xeynî a, b, an c karakterek din li hev dike

Navê bi os.rename()

os.rename(src, dst, *, src_dir_fd=None, dst_dir_fd=None)
Navê pel an pelrêça src bikin dst.
os — Miscellaneous operating system interfaces — Python 3.10.0 Documentation

Fonksiyona rename() ya modula os-ê bikar bînin, ku dê wekî ku nav pêşniyar dike navê wê biguhezîne.

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

Dûv re, a.jpg dê bibe a_000.jpg.

Bi str.format() jimareyên rêzkirî yên dagirtî yên sifir çêdikin

Mînakî, dema ku hejmarên rêzkirî li dehan pelan zêde dikin, em dixwazin li şûna “0” an “1” “00” an “11” bikar bînin. Heke hûn dixwazin bi vî awayî sifiran dagirin, rêbaza str.format() bikar bînin.

str.format(args,*kwargs)
Operasyonên formatkirina rêzê pêk tîne. Rêzika ku vê rêbazê vedixwîne dikare tîpên normal an qadên cîgir ên ku bi {} veqetandî ne hebin.Built-in Types — Python 3.10.0 Documentation

Hevoksaziya rêzikên taybetmendiya formatê
Di rêzika formatkirinê de “qada veguheztinê” ya ku di nav bendikên pîvaz de {} hatiye girtin heye.

Hevoksaziya qada veguheztinê wiha ye:
replacement_field ::= "{" [field_name] ["!" conversion] [":" format_spec] "}"

Bi peyvên sadetir, qada veguheztinê bi field_name dest pê dike, ku dibe sedem ku nirxa tişta diyarkirî were format kirin û li şûna qada veguheztinê di encam de were danîn. Li dû qada_navê, qada veguhertinê dikare bi nîşanek çuyîna ‘! Li dû qada_navê, qada veguhertinê dikare bi nîşanek çuyîna ‘! Format_spec dikare bi dubenda ‘:’ li dawiyê were nivîsandin. Ev forma ne-pêşniyazkirî ya nirxê ku were guheztin diyar dike.
string — Common string operations — Python 3.10.0 Documentation

Heke hûn dixwazin heya niha wê bi 0-ê tije bikin, jêrîn bikin.

# 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

Mînaka kodê ji bo lê zêdekirina rêzek/hejmarek rêz li ber pelê

Pêşîn, navê pelê bi os.path.basename(). Dûv re, li ber navê pelê xêzek an jimareyek rêzdar lê zêde bike, û bi os.path.join() re bi riya orîjînal ve girêbide.

Nimûneya jêrîn img_ li pêşiya hemî navên pelan zêde dike.

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

Encam wiha ye.

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

Heke hûn dixwazin jimareyên rêzdar lê zêde bikin, peyva for biguhezînin tiştek wekî vê: enumerate() da ku jimareyên li gorî rêzê ji 0-yê werin hejmartin. Di vê rewşê de, hejmar bi sê reqeman tê dagirtin.

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

Li vir encam e.

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

Heke hûn dixwazin li şûna 0-ê bi 1-ê dest pê bikin, argumana duyemîn a hejmartinê danîne 1-ê.

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

Wisa diçe.

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

Mînaka kodê ji bo lê zêdekirina rêzek/hejmarek rêzî piştî pelê

os.path.splitext() bikar bînin da ku pelê li dirêjkirin û riya root veqetînin, û dûv re rêzik an hejmarên rêzdar li riya root zêde bikin. Di mînaka jêrîn de, _img piştî navên hemî pelan tê zêdekirin.

import os
import glob

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

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

Encam ev e.

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

Mîna lêzêdekirina rêzek/hejmarek rêzî li ber pelê, dema ku jimareyek rêzdar lê zêde bike gotina for biguherîne.

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